维护 SQL Server 表上的索引

kal*_*mal 2 sql-server

我的问题是如何维护表上的索引,每周我们都会从表中删除和插入大量数据。因为删除和创建索引花费的时间太长..

Sql*_*hes 7

您可以设置一项工作来每周/每天重建或重组它们。

我建议查看http://sqlfool.com/2011/06/index-defrag-script-v4-1/

这个索引重建器是高度可定制的。


Tho*_*ger 5

您想要做的是对与您的特定表有关的索引碎片进行持续分析。以下查询将显示特定对象中所有索引的每个索引的平均碎片,这些索引的 arecord_count为 1000 或更大:

select
    ps.index_id,
    i.name,
    ps.index_type_desc,
    ps.alloc_unit_type_desc,
    ps.index_level,
    ps.avg_fragmentation_in_percent,
    case
        when ps.avg_fragmentation_in_percent < 5
            then 'NO ACTION'
        when ps.avg_fragmentation_in_percent >= 5
            and ps.avg_fragmentation_in_percent < 30
            then 'REORGANIZE'
        when ps.avg_fragmentation_in_percent >= 30
            then 'REBUILD'
    end as recommended_action
from sys.dm_db_index_physical_stats
(
    db_id('AdventureWorks2012'), 
    object_id('Person.Address'), 
    default, 
    default, 
    'detailed'
) ps
inner join sys.indexes i
on ps.object_id = i.object_id
and ps.index_id = i.index_id
where ps.record_count >= 1000
Run Code Online (Sandbox Code Playgroud)

您可以将其处理成一个逻辑脚本,该脚本根据您的环境和您拥有的维护窗口大小按计划运行。一个好的经验法则是,5% 到 30% 的碎片需要重新组织索引,30% 或更多的碎片应该重建。

编辑:我使用简单的CASE逻辑来帮助进行经验法则计算。