日期:2014-05-20  浏览次数:20904 次

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
这个确实很好。用这个吧。