• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

多年以前提高asp.net分页查询效率的一个实例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 

2004年数据库查询优化实例

情况:sqlserver 2000,资源表,记录近30万条。资源有一个整数的id字段,自动增量,但是资源可以被删除。所以,id并不连续。

.net SqlDataAdapter进行分页查询,由于Fill()方法的机制问题,使得在DataGrid里面进行翻页的时候延时非常大。数据库

服务器和web服务器同在局域网,延时大约有
3-4秒。经过分析,对此进行优化。

首先得知数据库的select count(id) from resource where id>n这样的查询速度非常快。所以利用这一点进行优化,以达到准确翻页

 

假设,记录的id是连续的,那么如果每页10条,那么我们要得到第12页,就需要第十一页最后一个记录的id11 x 10 = 110,这个记录id就是110。所以第12页这么得到,select top 10 * from resource where id>110,这条语句的查询效率是非常高的。

但是如果id不连续,怎么办呢?

这里进行估算。因为cpu进行数值运算的耗时比起数据库查询可以忽略不计。假设,id是连续的,那么先统计一个数字。如果id连续,那么第m页需要的前一个记录id可以这么得到:(m – 1) * 10。所以先统计:

Select count(id) from resource where id<=(m-1)*10

假设统计得到的值为pp<=(m-1)*10。如果p<(m-1)*10,那么我么可以这样查询:

Select top (((m-1)*10 – p) + 10) * from resource where id>(m-1)*10

查询完毕,取最后的10条记录就可以了。

这种方法对于实际的应用已经足够了。因为,一个几十万条记录的表一般是不经常删除操作的。如果有极端情况,那么可以连续估算2-3次,就可以比较准确了。

也就是(m-1)*10 – p很大的情况下,为了避免查询出太多的记录,进行二次估算。既然p太小了,再次假设id(m-1)*10后的记录号是连续的。我们需要的id(m-1)*10 + ((m-1)*10 – p) = 2*(m-1)*10 –p

查询:

Select count(id) from resource where id<=2*(m-1)*10 –p

得到q,那么我们真正需要的查询是:

Select top (2*(m-1)*10 –p – q+ 10) * from resource where id>2*(m-1)*10 –p

取查询结果的最后10条记录。

这种优化可以用存储过程来实现,获得更好的效果。

经过这样的优化以后,查询速度从原来的超过3秒多变成了瞬间,不足1秒,当时尚未使用存储过程。

这是在asp.net 1.1的时候,利用DataGrid绑定数据的时候解决sqlserver 2000查询效率的一个实例。在此提供出来只是提供一个思路,方案也许有用,也许已经过时了。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET(c#)——如何重新生成designer.cs文件发布时间:2022-07-10
下一篇:
ASP.NETMVC缓存发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap