SQL data reader reading data performance test

本文通过创建不同数据类型的表格并填充9024728行数据,对比了三种方法在读取数据时的性能差异:通过列索引、直接通过列名以及先获取列名再通过索引。结果显示,后两种方法几乎相同,且明显优于第一种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*Author: Jiangong SUN*/


As I've manipulated a lot of data using SQL data reader in recent project. And people says it's not good to access the data by column name.

So I've made an performance test in reading data from SQL data reader.


Firstly, I've created a table with different data types, like int, varchar, date time etc.

CREATE TABLE UserInformation(Id BIGINT, FirstName NVARCHAR(255), LastName NVARCHAR(255), ValidDate DATETIME, Identification UNIQUEIDENTIFIER)

Then, I've filled the table with 9024728 lines data. 

Why is it the exact number? It's because the sql server management studio crashes after 9024728 lines' insertion. :-)


Then, I'll use 3 methods to read the 9 millions lines data.


Method 1: Get data by column index


public void DataReaderGetDataByColumnIndex()
        {
            using (_dbConnection)
            {
                var sqlCommand = new SqlCommand(_commandText, _dbConnection);

                _dbConnection.Open();

                SqlDataReader reader = sqlCommand.ExecuteReader();

                var user = new UserInformationEntity();

                _GetByIndexTime.Start();
                while (reader.Read())
                {
                    user.Id = reader.GetInt64(0);
                    user.FirstName = reader.GetString(1);
                    user.LastName = reader.GetString(2);
                    user.ValidDate = reader.GetDateTime(3);
                    user.Identification = reader.GetGuid(4);
                }
                _GetByIndexTime.Stop();
                Console.WriteLine(string.Format("GetByIndexTime total time:{0}", _GetByIndexTime.Elapsed));
                _dbConnection.Close();
            }
        }



Method 2: Get data by column name


public void DataReaderGetDataByColumnName()
        {
            using (_dbConnection)
            {
                var sqlCommand = new SqlCommand(_commandText, _dbConnection);

                _dbConnection.Open();

                SqlDataReader reader = sqlCommand.ExecuteReader();

                var user = new UserInformationEntity();

                _GetByNameTime.Start();
                while (reader.Read())
                {
                    user.Id = Convert.ToInt64(reader["Id"]);
                    user.FirstName = reader["FirstName"].ToString();
                    user.LastName = reader["LastName"].ToString();
                    user.ValidDate = Convert.ToDateTime(reader["ValidDate"]);
                    user.Identification = new Guid(reader["Identification"].ToString());
                }
                _GetByNameTime.Stop();
                Console.WriteLine(string.Format("GetByNameTime total time:{0}", _GetByNameTime.Elapsed));
                _dbConnection.Close();
            }
        }



Method 3: Get column ordinal by column name, then Get data by column ordinal


public void DataReaderGetColumnIndexByColumnNameThenGetData()
        {
            using (_dbConnection)
            {
                var sqlCommand = new SqlCommand(_commandText, _dbConnection);

                _dbConnection.Open();

                SqlDataReader reader = sqlCommand.ExecuteReader();

                var user = new UserInformationEntity();

                var id = reader.GetOrdinal("Id");
                var firstName = reader.GetOrdinal("FirstName");
                var lastName = reader.GetOrdinal("LastName");
                var validDate = reader.GetOrdinal("ValidDate");
                var identification = reader.GetOrdinal("Identification");

                _GetByNameThenIndexTime.Start();
                while (reader.Read())
                {
                    user.Id = reader.GetInt64(id);
                    user.FirstName = reader.GetString(firstName);
                    user.LastName = reader.GetString(lastName);
                    user.ValidDate = reader.GetDateTime(validDate);
                    user.Identification = reader.GetGuid(identification);
                }
                _GetByNameThenIndexTime.Stop();
                Console.WriteLine(string.Format("GetByNameThenIndexTime total time:{0}", _GetByNameThenIndexTime.Elapsed));
                _dbConnection.Close();
            }
        }

When I run the program to get the execution time:



You can see that Method1 and Method3 has almost the same result, and Method2 are about 3 times longer.


So the prefered approach will be the third.


Enjoy coding!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值