寫法:
假裝有個表Shop,其中有一列ShopName,取100000到100050條數據。
ROW_NUMBER 的寫法
SELECT * FROM (
SELECT ShopName , ROW_NUMBER() OVER(ORDER BY ShopName) as R FROM Shop
) t WHERE R>100000 AND R<=100050
OFFSET,FETCH 的寫法
SELECT ShopName from Shop ORDER BY ShopName OFFSET 100000 ROW FETCH NEXT 50 ROW ONLY
比較:
之所以取十萬條以後的數據,能明顯看出執行時間上的差異。雖然前人們已經給出過很多論證,我這裏還是貼一下比較結果。
先是ROW_NUMBER
再是 OFFSET FETCH
高下立判,後者高效、易懂、語法簡潔有木有!
(但是聽聞超過5000w條數據後,結果不好說,這個我還沒試,手上的庫一般到1000w就拆表了,有興趣的可以試試哦,記得告訴我,咩哈哈哈)
私人小筆記:
OFFSET=偏移,跳過
FETCH = 取
另外OFFSET可以單獨使用,如下,既跳過前十萬條:
SELECT ShopName from Shop ORDER BY ShopName OFFSET 100000 ROW
題外話:
從 SQL SERVER 2000 那個大家還在寫TOP的年代,到2005的ROW_NUMBER,再到2012的OFFSET FETCH