CREATE TABLE [dbo].[TGongwen] (
[Gid] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[title] [varchar](80) NULL,
[fariqi] [datetime] NULL,
[neibuYonghu] [varchar](70) NULL,
[reader] [varchar](900) NULL -- 逗號分隔的閱讀者清單
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];
fariqi (日期)、neibuYonghu (發布單位)。title、reader 避免書籤查找。CREATE INDEX IX_TGongwen_Date_Dept ON TGongwen(fariqi, neibuYonghu) INCLUDE (title, reader);| 方法 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| NOT IN / NOT EXISTS | 排除前 N 筆 ID | 邏輯直觀 | 大頁碼效能急劇下降 |
| MAX(ID) 配合 TOP | 記住上一頁最大 ID,下一頁 WHERE ID > @lastMax | 極快、無深分頁問題 | 需 ID 連續遞增、不支援任意跳頁 |
| 衍生表 + ROW_NUMBER (2005+) | 視窗函數編號 | 標準、支援任意跳頁 | 2000 不支援 |
| 暫存表分頁 | 先寫入暫存表加身分識別欄,再查詢範圍 | 穩定、可重複讀 | 額外寫入開銷 |
-- 第一頁
SELECT TOP 20 Gid, title, fariqi, neibuYonghu
FROM TGongwen
WHERE fariqi BETWEEN '2004-01-01' AND '2004-12-31'
AND neibuYonghu = '通信科'
ORDER BY Gid;
-- 記住最後一筆 Gid = @lastGid
-- 下一頁
SELECT TOP 20 Gid, title, fariqi, neibuYonghu
FROM TGongwen
WHERE fariqi BETWEEN '2004-01-01' AND '2004-12-31'
AND neibuYonghu = '通信科'
AND Gid > @lastGid
ORDER BY Gid;
CREATE TABLE #PageCache (RowID INT IDENTITY(1,1), Gid INT, title VARCHAR(80), ...);
INSERT INTO #PageCache (Gid, title, ...)
SELECT Gid, title, ... FROM TGongwen WHERE ... ORDER BY Gid;
-- 第 N 頁 (每頁 20 筆)
SELECT * FROM #PageCache WHERE RowID BETWEEN (@Page-1)*20+1 AND @Page*20;
UPDATE STATISTICS TGongwen WITH FULLSCAN; 定期執行。千萬筆資料分頁核心在於「避免深分頁掃描」。游標式分頁 (Keyset Pagination) 效能最佳但限制導航模式;暫存表分頁通用但有寫入成本。配合覆蓋索引、統計資料維護、資料正規化與分割策略,才能在海量環境穩定支撐高併發查詢。