100% 索引碎片化

Cru*_*ler 3 index sql-server index-tuning sql-server-2014

我遇到了数据库性能问题,因此我们重建了所有索引,因为我们在维护它们方面做得并不好。重建运行了大约 20 分钟。然后我找到了一个查询来查看我的索引的外观

SELECT 
t.NAME 'Table name',
i.NAME 'Index name',
ips.index_type_desc,
ips.alloc_unit_type_desc,
ips.index_depth,
ips.index_level,
ips.avg_fragmentation_in_percent,
ips.fragment_count,
ips.avg_fragment_size_in_pages,
ips.page_count,
ips.avg_page_space_used_in_percent,
ips.record_count,
ips.ghost_record_count,
ips.Version_ghost_record_count,
ips.min_record_size_in_bytes,
ips.max_record_size_in_bytes,
ips.avg_record_size_in_bytes,
ips.forwarded_record_count
FROM 
sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'DETAILED') ips
INNER JOIN  
sys.tables t ON ips.OBJECT_ID = t.Object_ID
INNER JOIN  
sys.indexes i ON ips.index_id = i.index_id AND ips.OBJECT_ID = i.object_id
WHERE
AVG_FRAGMENTATION_IN_PERCENT > 0.0
ORDER BY
AVG_FRAGMENTATION_IN_PERCENT, fragment_count
Run Code Online (Sandbox Code Playgroud)

所以我的大多数索引的平均碎片化百分比 <1 但我有大约 10 个是 85%,另外 10 个是 100%

我不是 dba,对我在这里所做的事情知之甚少,但这肯定很糟糕吗?

还值得注意的是,100% 都是主键

我是否陷入了困境,还是我对统计数据的理解不正确?

注意:值得一提的是我的数据库是 24GB,我的驱动器有 115GB 中的 46GB 免费

根据上面的 sql,这些是我最糟糕的索引

编辑:根据下面的请求重新索引脚本

DECLARE @TableName VARCHAR(255)
DECLARE @sql NVARCHAR(500)
DECLARE @fillfactor INT
SET @fillfactor = 80
DECLARE TableCursor CURSOR FOR
SELECT OBJECT_SCHEMA_NAME([object_id])+'.['+name+']' AS TableName
FROM sys.tables
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
print @TableName
SET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR =     ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
EXEC (@sql)
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor
GO
Run Code Online (Sandbox Code Playgroud)

原始索引碎片 qry 的结果作为请求的结果附加

Kin*_*hah 7

我遇到了数据库性能问题,因此我们重建了所有索引,因为我们在维护它们方面做得并不好。

这是对性能问题的下意识反应。您的页数少于 10!重建索引对您的帮助最小。

我将首先阅读和理解如何分析 SQL Server 性能?