前言:DBA 核心能力
資料庫管理系統 (DBMS) 如 SQL Server、Oracle、Sybase 是系統核心層,優秀的網管應具備合格 DBA 能力。理解索引運作原理 (知其然、知其所以然) 是效能調校與架構設計的基石。
一、資料表物理儲存結構
基本單位:頁與區
- 頁:8KB 連續空間,編號 0-7;第 0 頁為檔案頭;資料列不可跨頁 → 列大小上限 8KB。
- 區:8 頁 = 64KB;混合區 (含資料/索引/空間頁) 供新表起始配置;一致區 專供資料/索引擴展。
- 堆積:所有資料頁的集合 (無叢集索引表)。
頁面類型
| 類型 | 用途 |
| PFS (Page Free Space) | 記錄頁配置狀態、混合/一致區、可用空間 |
| GAM (Global Allocation Map) | 追蹤空閒區 |
| SGAM (Shared GAM) | 追蹤含空閒頁的混合區 |
SQL Server 綜合利用 PFS/GAM/SGAM 即時配置新空間。
| IAM (Index Allocation Map) | **關鍵**:對應 FAT 表,記錄配置給表/索引的區/頁位置;每 IAM 管理 512,000 頁;首個 IAM 稱 FirstIAM,串聯後續 IAM。 |
| 資料頁 / 文字/圖像頁 / 索引頁 | 實際儲存資料、LOB、索引列 |
二、叢集索引與非叢集索引 B+ 樹結構
叢集索引
- 葉層 **即為資料列本身** (Data Pages);資料物理順序 = 邏輯順序 (鍵值有序)。
- 根頁 → 中繼頁 → 葉層 (資料頁);每層透過鍵值範圍導航。
- 查找流程:根頁比較鍵值 → 導向子頁 → ... → 定位葉層資料列 → **直接回傳資料** (無書籤查找)。
非叢集索引
- 葉層儲存 **索引鍵值 + 書籤** (叢集索引鍵值 或 RID/Heap 物理位置)。
- 查找流程:索引樹 Seek 定位葉層 → 取得書籤 → **書籤查找** 回基底表取得完整列。
- 一張表可建多個非叢集索引 (如書本多個主題索引)。
叢集索引優勢場景
- 範圍查詢 (日期區間、ID 區間) → 葉層連續掃描極快。
- 排序輸出 (ORDER BY 叢集鍵) → 免排序。
- 主鍵/身分證號/流水號 (唯一、遞增) → 最佳叢集鍵候選。
三、索引管理實務啟示
- 外鍵必建索引:避免 FK 檢查/連接時全表掃描。
- 高選擇性欄位建非叢集索引:配合 INCLUDE 形成覆蓋索引,消除書籤查找。
- 避免過度索引:每個非叢集索引增加寫入開銷 (INSERT/UPDATE/DELETE 需同步維護)。
- 填充因子:高寫入表預留空間減少頁分裂。
- 統計資料:索引建立自動產生統計資料;大量異動後手動/自動更新,確保優化器決策準確。
- 碎片整理:定期
ALTER INDEX REBUILD/REORGANIZE 消除邏輯/物理碎片。
四、其他資料庫系統互通性
Oracle、Sybase、DB2、PostgreSQL、MySQL (InnoDB) 皆採用 **B+ 樹** 索引結構,核心原理 (根/分支/葉層、書籤查找、叢集/非叢集概念) 完全一致,唯術語與實作細節略異 (如 Oracle 稱 Index-Organized Table 為叢集索引)。