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

SQL Server 索引原理深度解析:從資料頁、IAM 到 B+ 樹結構

     編輯:關於SqlServer

前言:DBA 核心能力

資料庫管理系統 (DBMS) 如 SQL Server、Oracle、Sybase 是系統核心層,優秀的網管應具備合格 DBA 能力。理解索引運作原理 (知其然、知其所以然) 是效能調校與架構設計的基石。

一、資料表物理儲存結構

基本單位:頁與區

  • 頁:8KB 連續空間,編號 0-7;第 0 頁為檔案頭;資料列不可跨頁 → 列大小上限 8KB。
  • 區:8 頁 = 64KB;混合區 (含資料/索引/空間頁) 供新表起始配置;一致區 專供資料/索引擴展。
  • 堆積:所有資料頁的集合 (無叢集索引表)。

頁面類型

  • SQL Server 綜合利用 PFS/GAM/SGAM 即時配置新空間。
  • 類型用途
    PFS (Page Free Space)記錄頁配置狀態、混合/一致區、可用空間
    GAM (Global Allocation Map)追蹤空閒區
    SGAM (Shared GAM)追蹤含空閒頁的混合區
    IAM (Index Allocation Map)**關鍵**:對應 FAT 表,記錄配置給表/索引的區/頁位置;每 IAM 管理 512,000 頁;首個 IAM 稱 FirstIAM,串聯後續 IAM。
    資料頁 / 文字/圖像頁 / 索引頁實際儲存資料、LOB、索引列

    二、叢集索引與非叢集索引 B+ 樹結構

    叢集索引

    • 葉層 **即為資料列本身** (Data Pages);資料物理順序 = 邏輯順序 (鍵值有序)。
    • 根頁 → 中繼頁 → 葉層 (資料頁);每層透過鍵值範圍導航。
    • 查找流程:根頁比較鍵值 → 導向子頁 → ... → 定位葉層資料列 → **直接回傳資料** (無書籤查找)。

    非叢集索引

    • 葉層儲存 **索引鍵值 + 書籤** (叢集索引鍵值 或 RID/Heap 物理位置)。
    • 查找流程:索引樹 Seek 定位葉層 → 取得書籤 → **書籤查找** 回基底表取得完整列。
    • 一張表可建多個非叢集索引 (如書本多個主題索引)。

    叢集索引優勢場景

    • 範圍查詢 (日期區間、ID 區間) → 葉層連續掃描極快。
    • 排序輸出 (ORDER BY 叢集鍵) → 免排序。
    • 主鍵/身分證號/流水號 (唯一、遞增) → 最佳叢集鍵候選。

    三、索引管理實務啟示

    1. 外鍵必建索引:避免 FK 檢查/連接時全表掃描。
    2. 高選擇性欄位建非叢集索引:配合 INCLUDE 形成覆蓋索引,消除書籤查找。
    3. 避免過度索引:每個非叢集索引增加寫入開銷 (INSERT/UPDATE/DELETE 需同步維護)。
    4. 填充因子:高寫入表預留空間減少頁分裂。
    5. 統計資料:索引建立自動產生統計資料;大量異動後手動/自動更新,確保優化器決策準確。
    6. 碎片整理:定期 ALTER INDEX REBUILD/REORGANIZE 消除邏輯/物理碎片。

    四、其他資料庫系統互通性

    Oracle、Sybase、DB2、PostgreSQL、MySQL (InnoDB) 皆採用 **B+ 樹** 索引結構,核心原理 (根/分支/葉層、書籤查找、叢集/非叢集概念) 完全一致,唯術語與實作細節略異 (如 Oracle 稱 Index-Organized Table 為叢集索引)。

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