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