SqlServer分页的问题
现在想实现模糊搜索时,能实现分页的效果,我已在网上找到了相应了方法:
如下:
ALTER PROCEDURE [dbo].[GetDataByPage]
(
@SQL nVARCHAR(4000),
@currentPage int,
@RecsPerPage nvarchar(50),
@selectField VARCHAR(255),
@sortField VARCHAR(255)
)
AS
DECLARE @Str nVARCHAR(4000)
if(@currentPage=1)
begin
set @Str = 'Select top '+@RecsPerPage + SubString(@SQL,7,3000)+ ' ORDER BY '+@sortField+ ' DESC '
end
else
begin
SET @Str= 'SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+ ' * FROM ( '+@SQL+ ') T WHERE T. '+@selectField+ ' NOT IN
(SELECT TOP '+CAST((@RecsPerPage*(@currentPage-1)) AS VARCHAR(20))+ ' '+@selectField+ ' FROM ( '+@SQL+ ') T9 ORDER BY '+@sortField+ ' DESC) ORDER BY '+@sortField+ ' DESC '
end
EXEC sp_ExecuteSql @Str
但是对LIKE的那种SQL语句,在前几页效果还行,但是在到100000万条左右时,效果很慢,大约得需要10几秒钟,请问大家有没有好的办法,帮帮忙啊,还有就是该对这个字段如何建索引?
------解决方案--------------------用于排序和分页的字段最好建立索引,或者就用主键。楼主可以在网上搜索一下通用分页存储过程,一大堆。推荐用数据库版版主邹健的存储过程。
http://community.csdn.net/Expert/topic/4918/4918971.xml?temp=.8418848
------解决方案--------------------not in效率不高,看看有没办法替换...
------解决方案--------------------分页本来就是越到后面越慢
TOP-N的分页方式尤其严重,因为使用了NOT IN谓词运算
建议使用ROWCOUNT分页方式,这种方式在开始的时候没有TOP那么快,但是到了后面却比对应的TOP快N多,因为不用使用不必要的谓词操作,制作索引的时候可以较方便的优化
而且你使用的是动态SQL,SQLSERVER必须每次都解释执行计划,但是这个的影响不是特别大,但我觉得你还是用代码组装好了SQL再发过来比较好,反正都是要单独解释执行计划,还不如让代码好看一些
------解决方案--------------------http://community.csdn.net/Expert/topic/4918/4918971.xml?temp=.8418848
这个确实很好。用这个吧。