sql server 海量数据速度提升:SQL优化-索引(13) 【转】

但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。虽然我可以把它改造为:  

 

 

SELECT TOP 页大小 *

  FROM Table1

  WHERE not exists

  (select * from (select top (页大小*页数) * from table1 order by id) b

  where b.id=a.id )

  order by id

 

 

  即,用not exists来代替not in,但我们前面已经谈过了,二者的执行效率实际上是没有区别的。

  既便如此,用TOP 结合NOT IN的这个方法还是比用游标要来得快一些。

  虽然用not exists并不能挽救上个存储过程的效率,但使用SQL SERVER中的TOP关键字却是一个非常明智的选择。因为分页优化的最终目的就是避免产生过大的记录集,而我们在前面也已经提到了TOP的优势,通过TOP 即可实现对数据量的控制。

  在分页算法中,影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。

  我们知道,几乎任何字段,我们都可以通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分水岭,使其成为分页算法中分开每页的参照物。在这里,我们可以用操作符“>”或“<”号来完成这个使命,使查询语句符合SARG形式。如:

  Select top 10 * from table1 where id>200

  于是就有了如下分页方案:

 

 

select top 页大小 *

  from table1

  where id>

  (select max (id) from

  (select top ((页码-1)*页大小) id from table1 order by id) as T

  )

  order by id

  

文章出处:http://blog.csdn.net/cuizm/article/details/4498991

posted @ 2012-02-22 11:00  zrj531  阅读(281)  评论(0编辑  收藏  举报