方法一:
SELECT TOP 頁大小 *
FROM table1 WHERE id NOT IN ( SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id ) ORDER BY id
方法二:
SELECT TOP 頁大小 *
FROM table1 WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 頁大小*(頁數-1) id FROM table1 ORDER BY id ) A ) ORDER BY id
網上的結論:
通過SQL 查詢分析器,顯示比較:我的結論是:
分頁方案一:(利用Not In和SELECT TOP分頁) 效率次之,需要拼接SQL語句 分頁方案二:(利用ID大于多少和SELECT TOP分頁)效率最高,需要拼接SQL語句
我的測試過程,大表條數: 1521715 條。 ID不設主鍵,不從1開始。 方案一的執(zhí)行計劃: 執(zhí)行時間0秒。 方案二的執(zhí)行計劃:(出現 緩沖池中的可用內存不足。的錯誤,重啟Sqlserver就好。) 執(zhí)行時間6秒。 分析如下: 方案一兩個表掃描行數只有100 和 150 。 方案二最后兩個節(jié)點是全表掃描。 這是最關鍵的。
ID 加主鍵情況: 方案一情況照舊。 方案二的執(zhí)行計劃: 執(zhí)行時間0秒。 但是,第一行最后一個節(jié)點都是掃描了100條記錄。 但是,方案一占用了17%,方案二占用了62%,在這里,占用量越大,整體時間越短。所以 方案二是最優(yōu)的,方案一浪費時間在兩個方面,一是 Not IN 需要 哈希匹配,二是第二個聚集索引掃描掃描了150條記錄,而方案二第二個聚集索引掃描只掃描了50條。
附Sql2005的方法三: SELECT TOP 頁大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) A WHERE RowNumber > 頁大小*(頁數-1) |
|
來自: KILLKISS > 《sqlserver》