SQL Server 堆表碎片监控

Mic*_*ael 3 sql-server clustered-index heap fragmentation

作为一名 SQL Server DBA,我有定期重建/重组索引的维护工作。最近,我问自己 SQL Server 中的表碎片问题。然后我阅读了有关堆表及其碎片的文章。我们不断以各种方式检查 SQL 服务器的状态,我想知道添加对表碎片的检查是否有用。

我正在考虑开发类似的东西:“它们是集群索引吗?” 是 -> 什么都不做,不 -> 所以检查:

percentage of fragmentation > x%

numbers of forward pointing > x

numbers of rows > x
Run Code Online (Sandbox Code Playgroud)

如果 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
Run Code Online (Sandbox Code Playgroud)

但是它运行了很长时间并且性能像 PLE 崩溃

Sco*_*red 6

我建议,与其“自己动手”,不如为自己节省大量时间和精力,并实施 Ola Hallengren 的索引维护脚本。

https://ola.hallengren.com/sql-server-index-and-statistics-maintenance.html

并且,查看 Brent Ozar 对 Ola 脚本的调整

https://www.brentozar.com/archive/2014/12/tweaking-defaults-ola-hallengrens-maintenance-scripts/