由于网页渲染速度的影响,在C/S程序中,一个Grid中包含几千、几万行的数据基本无法在网页上展示,所以一般都是以分页的形式展示(也可能是通过VisualScrolling加载,在企业应用系统中不是很常见)。ASP.NET数据控件一般都有分页功能。3.5之后也提供了单独的分页控件,也使用了第三方组件AspNetPager。.分页控件真的很方便。之前的处理方式是把所有的数据都取出来,然后通过控件进行处理。一般在数据量不大的时候,应该说感受不到优劣,但是因为每次从数据库中取,总是取所有的数据,肯定会增加压力数据库,传输的数据库多了也会对网络带宽造成压力。很有可能找出10000条数据,***表示只用了50条数据。翻页时,再次查看10000条数据,又显示了50条。下面的分页SQL比较常见,在SQLServer中有对应的使用TOP关键字的版本。记得刚开始学Oralce的时候,我就想过如何在minValue和maxValue之间使用rownum。和原来的疑惑一样的原理,rownum是在查询过程中产生的,所以下面的SQL其实是找出5300行,然后扔掉前5000行,返回后面的300行。当然这样就向前迈进了一大步,减少了数据库返回的数据,但是当查询的页数比较多的时候,查询还是有一定的浪费的。select*from(selecta.*,rownumasrnumfrom(select*fromyz_bingrenyz)awhererownum<=5300)whereernum>=5000Linq提供了Skip和TakeAPI可以用于分页。由于使用了EntityFramework,好奇之下使用EFProfiler查看生成的SQL,知道下面的分页比较好。主要是用row_numer()over()这样的分析函数,可以直接找到第5000行开始的地方,然后取出30行就行了。select*from(select*from(selectt.*,row_number()OVER(ORDERBYnull)AS"row_number"fromyz_bingrenyzt)pwherep."row_number">5000)qwhererownum<=30对比分析:前者在本地测试耗时1.3s,而后者只有0.25s,从下面的执行计划也能看出区别。在实际应用中,如果每次查询都要写这种SQL,一定很麻烦。可以使用存储过程来封装,但是由于SQL是动态执行的,效率肯定要打折扣,所以还是用C#来封装ASP.NET中的函数比较好。对于不使用EntityFramework而使用ADO.NET的,传入表名、主键名、页码、要抓取的行数作为参数,使用DBCommand执行并返回结果。原文链接:http://www.cnblogs.com/xiaopang2010/archive/2012/07/23/2604880.html【编者推荐】如何在Oracle中使用Java存储过程(详解)任重而道远从DB2迁移到Oracle11条重要的数据库设计规则10条让数据库更快的建议20条数据库设计最佳实践【责任编辑:彭凡TEL:(010)68476606】
