本系列探討如何在 1000 萬筆資料的 MS SQL Server 中實現快速資料提取與分頁。首先建立真實業務場景的測試表結構與海量測試資料。
CREATE TABLE [dbo].[TGongwen] (
[Gid] [int] IDENTITY(1,1) NOT NULL, -- 主鍵,自增 ID
[title] [varchar](80) COLLATE Chinese_PRC_CI_AS NULL, -- 文件標題
[fariqi] [datetime] NULL, -- 發文日期
[neibuYonghu] [varchar](70) COLLATE Chinese_PRC_CI_AS NULL, -- 發文用戶
[reader] [varchar](900) COLLATE Chinese_PRC_CI_AS NULL -- 閱讀用戶(逗號分隔)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
DECLARE @i INT
SET @i = 1
WHILE @i <= 250000
BEGIN
INSERT INTO Tgongwen(fariqi, neibuyonghu, reader, title)
VALUES('2004-2-5', '通信科',
'通信科,辦公室,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,治安支隊,外事科',
'這是最先的25萬條記錄')
SET @i = @i + 1
END
DECLARE @i INT
SET @i = 1
WHILE @i <= 250000
BEGIN
INSERT INTO Tgongwen(fariqi, neibuyonghu, reader, title)
VALUES('2004-9-16', '辦公室',
'辦公室,通信科,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,外事科',
'這是中間的25萬條記錄')
SET @i = @i + 1
END
DECLARE @h INT
SET @h = 1
WHILE @h <= 100
BEGIN
DECLARE @i INT
SET @i = 2002
WHILE @i <= 2003
BEGIN
DECLARE @j INT
SET @j = 0
WHILE @j < 50
BEGIN
DECLARE @k INT
SET @k = 0
WHILE @k < 50
BEGIN
INSERT INTO Tgongwen(fariqi, neibuyonghu, reader, title)
VALUES(CAST(@i AS VARCHAR(4)) + '-8-15 3:' +
CAST(@j AS VARCHAR(2)) + ':' + CAST(@k AS VARCHAR(2)),
'通信科',
'辦公室,通信科,王局長,劉局長,張局長,admin,刑偵支隊,特勤支隊,交巡警支隊,經偵支隊,戶政科,外事科',
'這是最後的50萬條記錄')
SET @k = @k + 1
END
SET @j = @j + 1
END
SET @i = @i + 1
END
SET @h = @h + 1
END
| 批次 | 筆數 | 日期特徵 | 業務模擬 |
|---|---|---|---|
| 第一批 | 250,000 | 單一固定日期 | 歷史歸檔資料 |
| 第二批 | 250,000 | 單一固定日期 | 階段性集中發文 |
| 第三批 | 500,000 | 精確到秒的時間戳 | 日常高頻業務流水 |
| 總計 | 1,000,000 |
註:原文程式碼透過三層迴圈(100 × 2 × 50 × 50 = 500,000)生成最後 50 萬筆,配合前兩批共 100 萬筆。實際千萬級測試需擴大迴圈倍數或執行多輪。
DECLARE @d DATETIME
SET @d = GETDATE()
-- 待測試的 SELECT 查詢
SELECT [執行耗時(毫秒)] = DATEDIFF(ms, @d, GETDATE())