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

SQL Server 效能優化實戰系列一:索引維護與碎片整理完整指南

     編輯:關於SqlServer

為何需要持續維護索引?

SQL Server 以 8KB 頁面儲存資料。叢集索引實際重排資料順序 (如字典目錄),非叢集索引儲存指標。插入資料導致頁面分裂,邏輯順序與物理順序脫節形成**碎片**,降低掃描效率。

碎片偵測:DBCC SHOWCONTIG

USE Northwind
DECLARE @table_id INT
SET @table_id = OBJECT_ID('Orders')
DBCC SHOWCONTIG(@table_id)

關鍵指標解讀

指標健康門檻說明
Scan Density100% 最佳Best Count:Actual Count,<100% 表示碎片
Logical Scan Fragmentation接近 0%索引頁邏輯順序亂序比例
Extent Scan Fragmentation越低越好區塊層級碎片
Avg. Page Density視填充因子頁面飽滿度,過低表示空間浪費

實測案例:Orders 表重建前後對比

指標重建前重建後 (PK_Orders, Fillfactor=90)
Scan Density60% [3:5]100% [3:3] ✓
Logical Fragmentation0%0%
Extent Fragmentation40%33.33%
Avg. Bytes Free/Page146.5869.2
Page Density98.19%89.26%

重建索引:DBCC DBREINDEX

-- 重建指定叢集索引
DBCC DBREINDEX('Northwind.dbo.Orders', 'PK_Orders', 90)

-- 重建所有索引
DBCC DBREINDEX('Northwind.dbo.Orders', '', 90)

參數:資料表名、索引名 (空白=全部)、填充因子 (0-100,越大頁面越滿)

自動化維護策略

  1. 排程作業:SQL Server Agent 定期執行 (離峰時段)
  2. 動態判斷:結合 DBCC SHOWCONTIG 結果,僅當 Scan Density < 90% 或 Fragmentation > 30% 時重建
  3. 線上替代方案 (Enterprise 版):DBCC INDEXDEFRAG / ALTER INDEX REORGANIZE (2005+) 線上整理,無鎖定

填充因子設定指引

  • 唯讀/極少修改表:FILLFACTOR = 100 (或 0)
  • 頻繁插入隨機鍵值:70-80 預留空間減少分裂
  • 遞增鍵值 (IDENTITY/日期):90-100 分裂僅發生尾端

後續主題預告

下一篇將涵蓋:查詢計劃分析、統計資料更新、參數嗅探問題、覆蓋索引設計。

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