@currentpage,每頁筆數 @pagesizeid 遞增唯一SELECT TOP @pagesize id, email, qq, wechat, phone, phone1
FROM contact
WHERE id NOT IN (
SELECT TOP (@pagesize * (@currentpage - 1)) id
FROM contact ORDER BY id ASC
)
ORDER BY id ASC;
缺點:NOT IN 子查詢隨頁碼增大掃描量線性增長,深分頁極慢;不支援複合主鍵。
SELECT TOP @pagesize *
FROM contact
WHERE id > (
SELECT MAX(id) FROM (
SELECT TOP (@pagesize * (@currentpage - 1)) id
FROM contact ORDER BY id ASC
) t
)
ORDER BY id ASC;
缺點:排序欄位必須唯一,非唯一欄位會漏資料或重複。
SELECT * FROM (
SELECT TOP (@pagesize * @currentpage)
ROW_NUMBER() OVER (ORDER BY id ASC) AS rn, *
FROM contact
) t
WHERE rn > @pagesize * (@currentpage - 1);
優點:支援任意排序、非唯一欄位、複合排序,執行計劃穩定。
| 寫法 | 適用版本 | 深分頁效能 | 支援非唯一排序 | 支援複合主鍵 |
|---|---|---|---|---|
| TOP + NOT IN | 2000+ | 差(O(N²)) | 是 | 否 |
| TOP + MAX | 2000+ | 中 | 否 | 否 |
| ROW_NUMBER | 2005+ | 優(單掃描) | 是 | 是 |
SELECT * FROM (
SELECT a.*, ROWNUM rn FROM (
SELECT * FROM aos_rms_user ORDER BY id
) a WHERE ROWNUM <= :maxRow
) WHERE rn >= :minRow;
OFFSET @offset ROWS FETCH NEXT @pagesize ROWS ONLYWHERE id > @lastId ORDER BY id LIMIT @pagesize