整理的几条MSSQL的分页办法和优化方案

by 尘缘 on 九月 18th, 2009 // Filed Under → SQL Server 2008

接触Asp不到半年,就投靠到PHP麾下,致使有两年编程经验的我,最薄弱的地方就是Asp+MSSQL,今天才发现,Asp终于被我彻底忘得一干二净了。

MSSQL不像MySql那样,可以使用LIMIT直接获取想的记录,仅需要指定开始的ID和想获取的条数即可。MSSQL的分页实现起来倒真是颇费周折。

这两天研究的内容,不是如何写分页类,而是分页的SQL的优化。

以下是搜集的几个不错的优化方案。

1,查询TOPA条记录,然后将记录集倒序,从中再查询TOPB条数据,就可以得到分前分页的记录,最后,可以再将记录集倒序一下,以实现正常排序。

示例SQL如下:

SELECT *
 FROM (SELECT TOP 2 *
 FROM (SELECT TOP 10 *
 FROM news_info
 WHERE (classid = '012')
 ORDER BY id) DERIVEDTBL
 ORDER BY id DESC) DERIVEDTBL
 ORDER BY id

PS:刚刚去装了SyntaxHighlighter这个代码高亮插件,效果真赞。

哦,这里记录一下,在MS SQLServer 2000/2005中  用derivedtbl 表示临时表(被推导出来的表),就不用再As来As去了。这种方式看起来复杂,实际上却不复杂,把三个括号打开就看得明白。这种方式比较常见于不同的排序列表页。

2,还有一种方式就是mssql_data_seek,这样的PHP函数来实现,简单来说,和上面的实现的原理,就是把指针直接移动到我们需要的这个起始ID上,个人觉得,貌似这样的效率要比第一点高一些。

以下给出一个代码片段。

$query = "select top 100 * from news order by id asc";
mssql_data_seek($query,$移动指针到这个ID);

总的看来,简单易用,效率估计比较高,麻烦的在于,PDO中好像不支持,找半天也没找见类似的函数,So,只能用第一条办法解解急。在这里急盼高手指点呐。

你可以任意转摘“整理的几条MSSQL的分页办法和优化方案”,但请保留本文出处和版权信息。
作者:尘缘,QQ:130775,来源:http://www.4wei.cn/archives/1000190



走过路过,千万不要飞过,那是鸟人: