前段时间看到了园子的朋友在讨论SQL Server的Paging Select问题,在感觉到有些朋友可能对SQL Server(2000以上版本的)的一些地方还不太清楚,这里分享一下SQL Server自2000版本后提供的一些特色处理方式:
TOP N排序
新的TOP N引擎可以减少以往先sort再top n的负载,当数据读入到Storage Engine时就先过滤出top n的记录,然后在对这些记录进行sort等操作,这样的设计可以在大多数情况下提升效率,缩短查询时间。
Merry-Go-Round Scans
胡百敬老师在他一本讲解性能调教的书中将其翻译为旋转木马式扫描,这个算法用于处理相同数据的重复扫描。例如我们有一页数据,两个用户都去查询它们,如果都是从page的开始部分进行scan,假设当user A scan到30%的时候user B开始scan操作,那么当user A进行到60%的时候user B刚好完成30%,这种设计可能会导致在扫描大型数据表的时候引起硬盘的剧烈震动!而采用Merry-Go-Round方式,当user A scan到30%的时候user B开始从A的当前位置scan,user A完成整个操作时user B完成了70%,然后再从页首开始scan剩下的30%,这样他们就使用相同的查询计划读取了部分数据。这种方式减少了大量在极端时间内先后查询相同的数据时,系统I/O来回读取的的情况,在增强读取速度和无序扫描的同时,也不需要同步了。
Katmai在这两方面有没有更好的改进还不知道,我的SQL Server 2008一直没法安装成功,也没法尝试一下,明天准备做虚机再试一次,有相似经历的朋友已经解决问题的还请指教一下。
posted on 2007-07-18 00:04
维生素C.NET 阅读(2749)
评论(12) 编辑 收藏 所属分类:
Training@cnblogs
发表评论
做基于数据库的MIS开发真的需要对数据库非常了解才好
记得msdn叫做shared scan的,旋转木马扫描有点别扭
TOP N排序
新的TOP N引擎可以减少以往先sort再top n的负载,当数据读入到Storage Engine时就先过滤出top n的记录,然后在对这些记录进行sort等操作,这样的设计可以在大多数情况下提升效率,缩短查询时间。
上面這句不是太懂,麻煩解釋一下。
先Sort再Top,和先Top再Sort,結果會不一樣啊?
TOP N排序
博主没有解释清楚,其根源不在于 top n 而在于 order by 后面的字段,就是排序字段。如果排序字段有索引的话,那么top n 才能发挥威力(因为事先已经排好顺序了),否则,top n 还是要乖乖的先得到所有的结果然后在排序,最后才能 top n 。
@zoti
传统方法:先对input排序,然后取top n
改进算法:对input进行一次扫描,使用一个临时表记录top n的内容(根据order by字段来取,每次跟踪、删除最小的记录),扫描结束后对临时表排序
@金色海洋(jyk)
SQL Server没有那么简单,就像对于同一个查询计划第一次执行、第二次执行和以后的执行的速度/性能差异是一样的,它本身对于数据是有感知力的。数据库中的数据是无序的,即使加了索引。
数据库里的数据怎么可能是无序的呢?你说的感知力是什么?无序的怎么索引呢?