一.語句一select top 每頁條數 from table where PK not in
(select top (頁數-1)*每頁條數 from table)
開始我始了這個方法﹐查詢前面几頁的時候還可以﹐可是越到后面頁就越慢﹐慢得有點讓人受不了二.語句二其實原理和上面差不多﹐只不過不是用子查詢﹐而是計算出要顯示的第一條記錄的主鍵declare @PK nvarchar(100)
select top (頁數-1)*每頁條數+1 @PK=PK from table
select top 每頁條數 from table where PK>=@PK
(這里默認為按主鍵升序排序)改成這樣后﹐效率暴高﹔
正在高興之余﹐我突然發現這樣寫雖然效率提高﹐但是卻有個問題!如果不是按主鍵排序﹐這樣分頁可能出錯(我認為要這樣寫﹐比較的那個字段或字段組必須是唯一的)我發現有些比較流行的分頁存儲過程也存在我說的問題:
在Baidu打"分頁存儲過程"﹐顯示的第一條記錄是﹕标题:千万数量级分页存储过程
代碼太長﹐我只把最后一個Select語句貼出:
EXEC('
DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow + '
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
SET ROWCOUNT ' + @strPageSize + '
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
')
作者是用排序字段作為比較字段的﹐如果排序字段有可能重復﹐那樣肯定就出錯了比如按時間排序﹐100頁有2006-10-1的數據﹐101頁也有2006-10-1數據﹐那么轉到101頁的時候就會出錯;這是小弟的一點心得﹐﹕)再次請各位大哥不要砸我啊

解决方案 »

  1.   

    顶一下!
    不过在sql2005中就不用这么麻烦了!
      

  2.   

    楼主的写法效率当然要高了,但是有些问题没解决:
    条件查询如何处理?主键不连续怎么办(某些记录已被删除)?...所谓鱼与熊掌,方法是为了解决实际问题存在的,合适的时候就用合适的方法此外,所谓千万级的分页实际上是没有意义的,用户凭什么要一次查询出数万条记录?假设一页显示50条,100页也就5000条,这已经是一般人能够看得过来的极限了;以CSDN为例,帖子何止千万,但也就显示20页~