Sql-Server

SQL Server 堆表碎片監控

  • September 9, 2016

作為 SQL Server DBA,我有維護工作來定期重建/重組索引。最近,我問自己關於 SQL Server 中的表碎片的問題。然後我閱讀了有關堆表及其碎片的文章。我們不斷以各種方式檢查 SQL 伺服器的狀態,我想知道添加對錶碎片的檢查是否有用。

我正在考慮開發類似的東西:“它們是集群索引嗎?” 是->什麼都不做,不->所以檢查:

percentage of fragmentation > x%

numbers of forward pointing > x

numbers of rows > x

如果 x > 一些值,則發出警報。

您如何看待設置這種檢查,有用與否?

堆表的碎片整理是否會減少磁碟上數據庫文件的物理大小?

編輯 :

我終於用這段程式碼來檢測需要重建的堆表:

SELECT Database_id, Object_name([object_id]) as TableName, Index_type_desc, 
Avg_fragmentation_in_percent, rowmodctr, forwarded_record_count
From sys.dm_db_index_physical_stats(db_id(),object_id(''),null,null,'detailed') AS SDDIPS
Inner join sys.sysindexes AS SI on SDDIPS.[object_id] = SI.id 
AND SDDIPS.index_id = SI.indid
--Inner join sysobjects AS SO on  SI.id = SO.id
Where index_level = 0 AND index_type_desc = 'HEAP' AND Avg_fragmentation_in_percent > 40 
AND rowmodctr > 100 AND forwarded_record_count > 1000

但是它執行了很長時間並且性能像 PLE 崩潰了

堆表的碎片整理是否會減少磁碟上數據庫文件的物理大小?

不,他們不會減少文件的物理大小。我們所說的碎片化logical fragmentation不是物理的。根據 BOL,堆的碎片定義為

這是堆的葉頁中無序範圍的百分比。無序範圍是指包含堆的目前頁的範圍在物理上不是包含前一頁的範圍之後的下一個範圍。

在此 SE 執行緒中閱讀有關堆碎片的更多資訊。我已經解釋了堆碎片是什麼意思。

碎片的概念實際上並不適合堆它們是一堆無序的頁面。處理堆的最佳建議是在其上創建聚集索引。還要注意,當你重建一個堆時,你也會重建所有非聚集索引,所以要小心,因為這會生成大量的 I/O 和事務日誌。在某些情況下,您可能需要重建堆以擺脫轉髮指針,在這種情況下,您當然可以,但請注意正在重建的 NCI。

我不認為當碎片超過索引的特定限制時發出警報是個好主意。只需定義每週或每週兩次重建索引的計劃就足夠了。您已經擁有 Ola Hallengren 腳本供您使用。

引用自:https://dba.stackexchange.com/questions/148202