SET @Str='Select TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T Where T.'+@ID+'NOT IN
(Select TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 orDER BY '+@Sort+') orDER BY '+@Sort
PRINT @Str
EXEC sp_ExecuteSql @Str
GO
其实,以上语句可以简化为:
Select TOP 页大小 *
FROM Table1
Where (ID NOT IN
(Select TOP 页大小*页数 id
FROM 表
orDER BY id))
orDER BY ID
但这个存储过程有一个致命的缺点,就是它含有NOT IN字样。虽然我可以把它改造为:
Select TOP 页大小 *
FROM Table1
Where not exists
(select * from (select top (页大小*页数) * from table1 order by id) b where b.id=a.id )
最后需要说明的是,在试验中,我发现用户在进行大数据量查询的时候,对数据库速度影响最大的不是内存大小,而是CPU。在我的P4 2.4机器上试验的时候,查看“资源管理器”,CPU经常出现持续到100%的现象,而内存用量却并没有改变或者说没有大的改变。即使在我们的HP ML 350 G3服务器上试验时,CPU峰值也能达到90%,一般持续在70%左右。
本文的试验数据都是来自我们的HP ML 350服务器。服务器配置:双Inter Xeon 超线程 CPU 2.4G,内存1G,操作系统Windows Server 2003 Enterprise Edition,数据库SQL Server 2000 SP3。