使用DaterReader分页读取大数据量数据

时间:2022-09-22 00:06:02
请教一下,
在数据库大数据量的情况下(百万)使用以下方式读取数据影响效率吗?
我连接本机数据库看速度还可以,数据库服务器时间有点长

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.LocalTransactionConnectionString,
 CommandType.Text, sbSql.ToString(), parameters))
            {
               
                while (rdr.Read())
                {
                    count++;
                    if (count >= start && end >= count)
                    {
                        
                        models.Add(model);
                    }
                }                
               
            }

14 个解决方案

#1


不建议使用DataReader,最好用DataSet,以免占用连接资源。

#2


引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

#3


引用 2 楼  的回复:
引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高

#4


引用 3 楼  的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高


原有的系统中几乎已经完成,所有的绑定读取数据都是用的读取数据库返回List<model>的方式,我想过使用dataset,但是这样改动太大

#5


你反正取出的数据不多啊,应该是在在大数据量中去获取获取数据吧,那应该2个问题不大吧,看看SQL语句写的如何,数据库设计的如何

#6


引用楼主  的回复:
请教一下,
在数据库大数据量的情况下(百万)使用以下方式读取数据影响效率吗?
我连接本机数据库看速度还可以,数据库服务器时间有点长
C# code

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.LocalTransactionConnectionString,
 CommandType.Text, sbSql.T……


这完全可以。

显然如果仅仅在你这个记录过滤方法,假设使用DataTable/DataSet读取然后再过滤掉start条记录,会慢得无法接受了,绝对不能使用什么DataSet。使用游标来以.net程序控制跳过start条记录,你就只能使用DBDataReder。

#7


DataAdapter本身的分页方法
Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords)
它其实就是跟你的方法一样,使用DbDaatReader读取,并且前start个记录跳过(也就是不读取到内存里)。因此原理跟你的代码一样,而且显然没有你的代码更简洁方便(因为DataSet要维护有很多状态和其它功能)。所以说,你的代码不但是正确的,而且比所谓的DataSet分页要轻快多了。

而至于说同样的sql语句,是不是写成存储过程就“执行得快了”,我想你自己测试下就知道了,看看到底有几毛钱价值,到底是方便了还是繁琐了。

#8


引用 4 楼  的回复:
引用 3 楼 的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高


原有的系统中几……

LZ我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的

#9


引用 8 楼  的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。

#10


引用 8 楼  的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高……


其实这是我问题的重点,因为原有的结构上已经是这个方式了,现在能想到的只能写加分页的重载,这样对于目前我们的系统来说是最小的改动方式了, 所以请教一下在原有的方式的基础上,能增加分页并且效率较高改动最小的方式。。。。

#11


引用 9 楼  的回复:
引用 8 楼 的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。


呵呵,真的不是我懒,因为项目的情况,我已经是天天加班到10点,周六日我也在上班了。。。所以过来请教能增加分页并且效率较高改动最小的方式。。。。

#12


引用 11 楼  的回复:
引用 9 楼  的回复:
引用 8 楼 的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。


呵呵,真的不是我懒,因为项目的情况,我已经是天天加班到10点,周六日我也在上班了。。。所……

我觉得LZ可能陷入一个死圈了,
我觉得本身从数据库里面读取100W条数据就是一个很大的开销了,在此基础上优化出来的效果就很不明显了,
所以还是建议LZ尽量改成读取相应分页条数的数据,你想那么多方法去优化还不如改了你的代码。
还有另一个LZ可以建议数据库的缓存,那这样的话对读取数据的压力就会减小很多,运行速度也会大大加快。

#13


dataset是不如datareader。动软生成的代码貌似是dataset,然后bll层是DataTableToList转成list<model>。我不太清楚如果分页的话dal层用datareader和dataset效率有没有大区别。

#14


引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


DataSet 就是用 DataReader 构建的。

初学者别模仿动软的代码,DataTableToList 就绕弯路了。

#1


不建议使用DataReader,最好用DataSet,以免占用连接资源。

#2


引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

#3


引用 2 楼  的回复:
引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高

#4


引用 3 楼  的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高


原有的系统中几乎已经完成,所有的绑定读取数据都是用的读取数据库返回List<model>的方式,我想过使用dataset,但是这样改动太大

#5


你反正取出的数据不多啊,应该是在在大数据量中去获取获取数据吧,那应该2个问题不大吧,看看SQL语句写的如何,数据库设计的如何

#6


引用楼主  的回复:
请教一下,
在数据库大数据量的情况下(百万)使用以下方式读取数据影响效率吗?
我连接本机数据库看速度还可以,数据库服务器时间有点长
C# code

using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.LocalTransactionConnectionString,
 CommandType.Text, sbSql.T……


这完全可以。

显然如果仅仅在你这个记录过滤方法,假设使用DataTable/DataSet读取然后再过滤掉start条记录,会慢得无法接受了,绝对不能使用什么DataSet。使用游标来以.net程序控制跳过start条记录,你就只能使用DBDataReder。

#7


DataAdapter本身的分页方法
Fill(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords)
它其实就是跟你的方法一样,使用DbDaatReader读取,并且前start个记录跳过(也就是不读取到内存里)。因此原理跟你的代码一样,而且显然没有你的代码更简洁方便(因为DataSet要维护有很多状态和其它功能)。所以说,你的代码不但是正确的,而且比所谓的DataSet分页要轻快多了。

而至于说同样的sql语句,是不是写成存储过程就“执行得快了”,我想你自己测试下就知道了,看看到底有几毛钱价值,到底是方便了还是繁琐了。

#8


引用 4 楼  的回复:
引用 3 楼 的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高


原有的系统中几……

LZ我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的

#9


引用 8 楼  的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。

#10


引用 8 楼  的回复:
引用 4 楼 的回复:
引用 3 楼 的回复:
引用 2 楼 的回复:

引用 1 楼 的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


准确的说是我在原有的系统上进行更改。。。原有的系统没有分页。而不想改动太多。。。

在读取数据的时候把DataReader改成DataSet应该很方便的吧?
还有建议LZ用存储过程来分页哈,这样效率要高……


其实这是我问题的重点,因为原有的结构上已经是这个方式了,现在能想到的只能写加分页的重载,这样对于目前我们的系统来说是最小的改动方式了, 所以请教一下在原有的方式的基础上,能增加分页并且效率较高改动最小的方式。。。。

#11


引用 9 楼  的回复:
引用 8 楼 的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。


呵呵,真的不是我懒,因为项目的情况,我已经是天天加班到10点,周六日我也在上班了。。。所以过来请教能增加分页并且效率较高改动最小的方式。。。。

#12


引用 11 楼  的回复:
引用 9 楼  的回复:
引用 8 楼 的回复:
Z我看你的代码是不是把所有的记录都读取出来,再read的循环里面读取相应分页的数据的?
如果是这样的话在数据库查询的时候为什么不直接查询相应分页的数据条数呢?
这样就会大大提高运行的效率了,用datareader也ok的


他懒呗。


呵呵,真的不是我懒,因为项目的情况,我已经是天天加班到10点,周六日我也在上班了。。。所……

我觉得LZ可能陷入一个死圈了,
我觉得本身从数据库里面读取100W条数据就是一个很大的开销了,在此基础上优化出来的效果就很不明显了,
所以还是建议LZ尽量改成读取相应分页条数的数据,你想那么多方法去优化还不如改了你的代码。
还有另一个LZ可以建议数据库的缓存,那这样的话对读取数据的压力就会减小很多,运行速度也会大大加快。

#13


dataset是不如datareader。动软生成的代码貌似是dataset,然后bll层是DataTableToList转成list<model>。我不太清楚如果分页的话dal层用datareader和dataset效率有没有大区别。

#14


引用 1 楼  的回复:
不建议使用DataReader,最好用DataSet,以免占用连接资源。


DataSet 就是用 DataReader 构建的。

初学者别模仿动软的代码,DataTableToList 就绕弯路了。