好天气看好电影

魔戒台词:刚铎和洛汉的好男儿,我的好兄弟;我在你们眼中...,看到了我心中也感受到的恐惧;有一天人类将失去勇气...,我们将众叛亲离,一败涂地;但不是今天;有一天邪将胜正,人类的世界也会完全毁灭;但不是今天;今天我们要誓死奋战。为了你们在世上所珍惜的一切...,一定要奋战到底
free hit counter

统计

最新评论

  • 1. re: 验证码的妙用
  • 楼主: SSL 和 VPN 是两个不同的概念。可以了解下... 前者主要用来加密传输的数据,而后者则用来限制外网的访问(当然也存在数据加密),从而提高安全性。 SSL: VPN: ...
  • --music000
  • 2. re: 回忆一 --- 去年6月面试进入公司的日子
  • 高人。
  • --呵呵哈哈111
  • 3. re: Mdi子窗口之闪烁问题的解决
  • 博主你好,我是一个刚学winform (VS 2005 C#)的学生.对你的文章很感觉兴趣,我碰到的问题就是你这文章上的问题, 被MDI窗口的这个闪烁问题困惑了很久,不知道在VS2005 里边怎么去改...
  • --liyunfeng
  • 4. re: 多年以前提高asp.net分页查询效率的一个实例
  • @michael_fei 我觉得一般在实际的应用中,对一个记录巨多的表,用id字段查询的情形少,对用户也只是个形式。如果排序字段不固定,那就是有了其它字段来过滤,只要这些字段上有索引什么的,就没必要采...
  • --信息加油站义工
  • 5. re: 多年以前提高asp.net分页查询效率的一个实例
  • 我觉得不知道有人是否了解这个方法的具体意义,也许是我搞错了。影响查询速度的根本原是select 出来的记录数量,用表变量,只要top 后的数字非常巨大,性能还是没法提高。我的方法是建立在已经解决问题的...
  • --信息加油站义工

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

 

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查询效率的一个实例。在此提供出来只是提供一个思路,方案也许有用,也许已经过时了。

posted on 2008-07-07 22:19 信息加油站义工 阅读(1934) 评论(13)  编辑 收藏 所属分类: 8. 信息技术5. 数据结构与算法1. dotnet7. 数据库9. 程序设点滴

评论

#1楼  2008-07-07 23:32 谦虚的天下      

利用估算,妙!   回复  引用  查看    

#2楼  2008-07-08 07:23 金色海洋(jyk)      

大哥,30w就估算了,服了。我的客户是绝对不会接受“估算”的。

我这里有一个精确定位的方法,而且一点也不比你的这个方法慢。

公式:

declare @col int

select top {PageSize * (PageIndex-1)+1} @col = [排序字段]
from [表名|视图名]
[ where 查询条件 ]
order by [排序字段] asc|desc

select top PageSize 需要显示的字段
from [表名|视图名]
where [排序字段] >= @col
[ and 查询条件 ]
order by [排序字段] asc|desc

第二个select 和你的思路是一样的,区别在于第一个select ,就是在id不连续的时候的定位方法,例如计算排在第30位的记录的 ID值。

select top 30 @col = ID from tableName order by ID.

select @col

这时这个 @col 的值是什么?就是你需要的那个精确的值。

换成Max的方式也是一样的。

建议多研究一下索引。


http://www.cnblogs.com/jyk/archive/2008/05/07/1187143.html   回复  引用  查看    

#3楼  2008-07-08 08:48 kiler      

一般来说简简单单加个TOP就ok了,不会有多少人往最后几页点的。   回复  引用  查看    

#4楼  2008-07-08 09:15 爱在戏院前      

测试会点   回复  引用  查看    

#5楼  2008-07-08 09:57 乐子哥      

这个是1.1的分页,难道2.0的就不用写SQL代码分页吗?datagrid或dataview可以直接分页?

不懂还请指点   回复  引用  查看    

#6楼  2008-07-08 11:29 电机拖动      

嗯,这的确是一个不错的思路

不过我会更加倾向于“充分利用索引”的方式,然后配合这种估算,应该会好很多的   回复  引用  查看    

#7楼  2008-07-08 12:12 胡一刀      

top 变量 怎么处理
觉得有时候估算也可以   回复  引用  查看    

#8楼  2008-07-08 12:59 天天他 [未注册用户]

没有 任何通用型.   回复  引用    

#9楼  2008-07-08 19:52 我是山大王 [未注册用户]

表变量就可以 怎么估算呢 多大的数据也不用估算   回复  引用    

#10楼  2008-07-08 23:31 michael_fei      

请问楼主,如果排序字段不固定,那怎么处理???   回复  引用  查看    

#11楼  2008-07-09 09:44 yencain      

已收藏!谢谢楼主!   回复  引用  查看    

#12楼 [楼主] 2008-07-17 12:03 信息加油站义工      

我觉得不知道有人是否了解这个方法的具体意义,也许是我搞错了。影响查询速度的根本原是select 出来的记录数量,用表变量,只要top 后的数字非常巨大,性能还是没法提高。我的方法是建立在已经解决问题的实践上,如果有人遇到了可以试试我的方法和表变量, 用了表变量,为了降低top后面的数字大小,也可以估算一下。   回复  引用  查看    

#13楼 [楼主] 2008-07-17 12:08 信息加油站义工      

@michael_fei
我觉得一般在实际的应用中,对一个记录巨多的表,用id字段查询的情形少,对用户也只是个形式。如果排序字段不固定,那就是有了其它字段来过滤,只要这些字段上有索引什么的,就没必要采取这些优化方法。做业务的时候只要考虑用户的需求,你就发现其实很多时候你想多了。我们技术人员经常考虑的一些技术难题,其实对用户是不实用的。请好好体会   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: