用DataReader分页与几种传统的分页方法的比较

对于数据库的分页,目前比较传统的方法是采用分页存储过程,其实用 DataReader 也可以实现分页 ,不需要写存储过程,实现效率上也比几种比较流行的分页方法要略快。

在开始这个方法之前,让我们先创建一个简单的测试环境:

use Test
GO

if exists (select * from sysobjects where id = object_id('R_Student') and type = 'u')
   drop table R_Student
GO
create table R_Student
(
   Id     nvarchar(64) Primary Key,
   Class    nvarchar(64) NOT NULL,
   Age     tinyint    NOT NULL,
   Sex     tinyint    NOT NULL  
)

GO
Declare
@i int
set @i = 0;
while (@i < 1000000)
begin
insert R_Student values('Name' + Str(@i),'Class' + Str(@i), @i % 100, @i % 2)
set @i = @i + 1
end

通过上述语句创建一个简单的数据表,并插入100万条记录

DataReader 分页的方法:

说出来很简单,见下面程序 

    public DataSet RangeQuery(string queryString, long first, long last)
     {
       try
       {
         OpenDataReader(queryString);

         if (first < 0)
         {
           first = 0;
         }

         for (long i = 0; i < first; i++)
         {
           if (!_DataReader.Read())
           {
             return _SchemaDataSet;
           }
         }

         if (last < 0)
         {
           last = 0x7FFFFFFFFFFFFFFF;
         }

         for (long i = first; i <= last; i++)
         {
           DataRow row = NextRow();

           if (row != null)
           {
             _SchemaTable.Rows.Add(row);
           }
           else
           {
             return _SchemaDataSet;
           }
         }

         return _SchemaDataSet;
       }
       finally
       {
         CloseDataReader();
       }
     }

其实就是通过DataReader 将当前记录移动到起始页对应的那条纪录,然后再开始读数据。由于之前只是移动记录指针,并不读取数据,所以效率很高。

时间: 2024-09-22 03:13:58

用DataReader分页与几种传统的分页方法的比较的相关文章

利用redis缓存热门数据,分页的一种思路

普通分页 一般分页做缓存都是直接查找出来,按页放到缓存里,但是这种缓存方式有很多缺点. 如缓存不能及时更新,一旦数据有变化,所有的之前的分页缓存都失效了. 比如像微博这样的场景,微博下面现在有一个顶次数的排序.这个用传统的分页方式很难应对. 一种思路 最近想到了另一种思路. 数据以ID为key缓存到Redis里: 把数据ID和排序打分存到Redis的skip list,即zset里: 当查找数据时,先从Redis里的skip list取出对应的分页数据,得到ID列表. 用multi get从re

asp下计算分页的几种方法_应用技巧

<%     '计算分页的几种方法      '// iRecordCount为要计算的页面总数     '// iRecordCount为记录集数     '// iPageSize为每页记录数     '// 一:     If iRecordCount Mod iPageSize = 0 Then         iPageCount = Int(iRecordCount / iPageSize)     Else         iPageCount = Int(iRecordCount

分页查询 索引-分页查询两种方式结果却不同

问题描述 分页查询两种方式结果却不同 select * from emp where rowid in (select rid from (select rownum rn ,rid from (select rowid rid from emp ) where rownum where rn>4) order by deptno; select * from (select t.*,rownum rn from (select * from emp ) t where rownum )wher

几种SqlServer2005高效分页sql查询语句

几种sqlserver2005高效分页sql查询语句 top方案: sql codeselect top 10 * from table1 where id not in(select top 开始的位置 id from table1) max: sql codeselect top 10 * from table1 where id>(select max(id) from (select top 开始位置 id from table1order by id)tt) row: sql code

Hibernate分页的两种实现方法_java

本文实例讲述了Hibernate分页的两种实现方法.分享给大家供大家参考,具体如下: 1. criteria分页 public Page getPage(int currentPage,int pageSize,Criterion...crts){ Criteria c=session.createCriteria(House.class); List list=null; for (int i = 0; i < crts.length; i++) { c.add(crts[i]); } c.s

几种常见SQL分页方式效率比较

分页很重要,面试会遇到.不妨再回顾总结一下. 1.创建测试环境,(插入100万条数据大概耗时5分钟). createdatabaseDBTestuseDBTest --创建测试表createtablepagetest ( idintidentity(1,1)notnull, col01intnull, col02nvarchar(50)null, col03datetimenull ) --1万记录集declare@iintset@i=0while(@i<10000)begininsertint

GridView自定义分页的四种存储过程_MsSql

1. 为什么不使用GridView的默认分页功能 首先要说说为什么不用GridView的默认的分页功能,GridView控件并非真正知道如何获得一个新页面,它只是请求绑定的数据源控件返回适合规定页面的行,分页最终是由数据源控件完成.当我们使用SqlDataSource或使用以上的代码处理分页时.每次这个页面被请求或者回发时,所有和这个SELECT语句匹配的记录都被读取并存储到一个内部的DataSet中,但只显示适合当前页面大小的记录数.也就是说有可能使用Select语句返回1000000条记录,

EasyUI Pagination 分页的两种做法小结_jquery

EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,一种是datagrid默认机制,另一种是利用 Ajax 获取数据并填充 Datagrid,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: public JsonResult GetQuestionUnit() { // easyui datagrid 自身会通过 post 的形式传递 rows and page int pageSize = Con

几种SQL Server分页的存储过程写法以及性能比较

几种SQL Server分页的存储过程写法以及性能比较 存储过程的5种分页写法,下面的代码是从忘了什么时候从别人那Ctrl+C来的,所以仅仅作为收藏,希望作者看到不要喷我.  ------创建数据库教程data_Test ----- create database data_Test  GO use data_Test GO create table tb_TestTable   --创建表 (     id int identity(1,1) primary key,     userName