[點晴永久免費OA]SQLServer索引碎片的整理
當前位置:點晴教程→點晴OA辦公管理信息系統
→『 經驗分享&問題答疑 』
你可能已經創建好了索引,并且所有索引都在工作,但性能卻仍然不好,那很可能是產生了索引碎片,你需要進行索引碎片整理。
什么是索引碎片? 由于表上有過度地插入、修改和刪除操作,索引頁被分成多塊就形成了索引碎片,如果索引碎片嚴重,那掃描索引的時間就會變長,甚至導致索引不可用,因此數據檢索操作就慢下來了。 有兩種類型的索引碎片:內部碎片和外部碎片。 內部碎片:為了有效的利用內存,使內存產生更少的碎片,要對內存分頁,內存以頁為單位來使用,最后一頁往往裝不滿,于是形成了內部碎片。 外部碎片:為了共享要分段,在段的換入換出時形成外部碎片,比如5K的段換出后,有一個4k的段進來放到原來5k的地方,于是形成1k的外部碎片。 如何知道是否發生了索引碎片? 執行下面的SQL語句就知道了(下面的語句可以在SQL Server 2005及后續版本中運行,用你的數據庫名替換掉這里的AdventureWorks): SELECT object_name(dt.object_id) Tablename,si.name IndexName,dt.avg_fragmentation_in_percent AS ExternalFragmentation,dt.avg_page_space_used_in_percent AS InternalFragmentation FROM ( SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent FROM sys.dm_db_index_physical_stats (db_id(''AdventureWorks''),null,null,null,''DETAILED'' ) WHERE index_id <> 0) AS dt INNER JOIN sys.indexes si ON si.object_id=dt.object_id AND si.index_id=dt.index_id AND dt.avg_fragmentation_in_percent>10 AND dt.avg_page_space_used_in_percent<75 ORDER BY avg_fragmentation_in_percent DESC 執行后顯示AdventureWorks數據庫的索引碎片信息。 圖 1 索引碎片信息 使用下面的規則分析結果,你就可以找出哪里發生了索引碎片: 1)ExternalFragmentation的值>10表示對應的索引發生了外部碎片; 2)InternalFragmentation的值<75表示對應的索引發生了內部碎片。 如何整理索引碎片? 有兩種整理索引碎片的方法: 1)重組有碎片的索引:執行下面的命令 ALTER INDEX ALL ON TableName REORGANIZE 2)重建索引:執行下面的命令 ALTER INDEX ALL ON TableName REBUILD WITH (FILLFACTOR=90,ONLINE=ON) 也可以使用索引名代替這里的“ALL”關鍵字重組或重建單個索引,也可以使用SQL Server管理工作臺進行索引碎片的整理。 圖 2 使用SQL Server管理工作臺整理索引碎片 什么時候用重組,什么時候用重建呢? 當對應索引的外部碎片值介于10-15之間,內部碎片值介于60-75之間時使用重組,其它情況就應該使用重建。 值得注意的是重建索引時,索引對應的表會被鎖定,但重組不會鎖表,因此在生產系統中,對大表重建索引要慎重,因為在大表上創建索引可能會花幾個小時,幸運的是,從SQL Server 2005開始,微軟提出了一個解決辦法,在重建索引時,將ONLINE選項設置為ON,這樣可以保證重建索引時表仍然可以正常使用。 雖然索引可以提高查詢速度,但如果你的數據庫是一個事務型數據庫,大多數時候都是更新操作,更新數據也就意味著要更新索引,這個時候就要兼顧查詢和更新操作了,因為在OLTP數據庫表上創建過多的索引會降低整體數據庫性能。 我給大家一個建議:如果你的數據庫是事務型的,平均每個表上不能超過5個索引,如果你的數據庫是數據倉庫型,平均每個表可以創建10個索引都沒問題。 該文章在 2020/11/13 9:08:04 編輯過 |
關鍵字查詢
相關文章
正在查詢... |