|
方法一:
SELECT TOP 頁(yè)大小 *
FROM table1 WHERE id NOT IN ( SELECT TOP 頁(yè)大小*(頁(yè)數(shù)-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è)數(shù)-1) id FROM table1 ORDER BY id ) A ) ORDER BY id
網(wǎng)上的結(jié)論:
通過(guò)SQL 查詢(xún)分析器,顯示比較:我的結(jié)論是:
分頁(yè)方案一:(利用Not In和SELECT TOP分頁(yè)) 效率次之,需要拼接SQL語(yǔ)句 分頁(yè)方案二:(利用ID大于多少和SELECT TOP分頁(yè))效率最高,需要拼接SQL語(yǔ)句
我的測(cè)試過(guò)程,大表?xiàng)l數(shù): 1521715 條。 ID不設(shè)主鍵,不從1開(kāi)始。 方案一的執(zhí)行計(jì)劃:
執(zhí)行時(shí)間0秒。 方案二的執(zhí)行計(jì)劃:(出現(xiàn) 緩沖池中的可用內(nèi)存不足。的錯(cuò)誤,重啟Sqlserver就好。)
執(zhí)行時(shí)間6秒。 分析如下: 方案一兩個(gè)表掃描行數(shù)只有100 和 150 。 方案二最后兩個(gè)節(jié)點(diǎn)是全表掃描。 這是最關(guān)鍵的。
ID 加主鍵情況: 方案一情況照舊。 方案二的執(zhí)行計(jì)劃:
執(zhí)行時(shí)間0秒。 但是,第一行最后一個(gè)節(jié)點(diǎn)都是掃描了100條記錄。 但是,方案一占用了17%,方案二占用了62%,在這里,占用量越大,整體時(shí)間越短。所以 方案二是最優(yōu)的,方案一浪費(fèi)時(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è)數(shù)-1) |
|
|
來(lái)自: KILLKISS > 《sqlserver》