首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

海量資料庫 (千萬筆) 查詢優化與分頁演算法實戰方案

     編輯:關於SqlServer

場景:辦公自動化系統紅頭文件表 (TGongwen) 超過 1000 萬筆

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];

核心優化策略

1. 索引設計:覆蓋索引 + 篩選條件順序

  • 高選擇性欄位優先:fariqi (日期)、neibuYonghu (發布單位)。
  • 建立覆蓋索引包含 title、reader 避免書籤查找。
  • 範例:CREATE INDEX IX_TGongwen_Date_Dept ON TGongwen(fariqi, neibuYonghu) INCLUDE (title, reader);

2. 分頁查詢演算法比較 (SQL Server 2000 環境)

方法原理優點缺點
NOT IN / NOT EXISTS排除前 N 筆 ID邏輯直觀大頁碼效能急劇下降
MAX(ID) 配合 TOP記住上一頁最大 ID,下一頁 WHERE ID > @lastMax極快、無深分頁問題需 ID 連續遞增、不支援任意跳頁
衍生表 + ROW_NUMBER (2005+)視窗函數編號標準、支援任意跳頁2000 不支援
暫存表分頁先寫入暫存表加身分識別欄,再查詢範圍穩定、可重複讀額外寫入開銷

3. 針對本案例推薦:MAX(ID) 游標式分頁 (適合「下一頁」導向)

-- 第一頁
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;

4. 任意跳頁需求:暫存表 + 身分識別欄

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; 定期執行。
  • 避免 SELECT *:僅查詢必要欄位。
  • reader 欄位正規化:將逗號分隔字串拆解為關聯表,利用索引查詢特定閱讀者文件。
  • 分割資料表:依年份/月份水平分割 (Partition View 或 Partitioned Table 2005+)。
  • 非叢集索引鍵長度:盡量窄,減少 I/O。

總結

千萬筆資料分頁核心在於「避免深分頁掃描」。游標式分頁 (Keyset Pagination) 效能最佳但限制導航模式;暫存表分頁通用但有寫入成本。配合覆蓋索引、統計資料維護、資料正規化與分割策略,才能在海量環境穩定支撐高併發查詢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved