【问题标题】:Disable & Enable or Drop & Create Non Clustered Indexes for Bulk Delete Operations为批量删除操作禁用和启用或删除和创建非聚集索引
【发布时间】:2019-08-16 10:39:46
【问题描述】:

我有几张表有数百万的数据。我想根据列值定期删除一些条目。但是大多数表都定义了多个索引。那么我应该选择删除并创建非聚集索引方案还是禁用和启用非聚集索引以获得更好的性能?我需要将相应的删除过程安排为计划作业,因为此任务需要每周重复一次。

【问题讨论】:

  • 你只能通过测试才能确定,但​​一般来说,如果表很大,你要删除少量的行,重新创建索引的成本将远远超过你获得的时间。无需维护索引即可删除。您还可以考虑在列上对表进行分区,以允许通过截断分区来删除数据,这要快得多。

标签: sql sql-server database-performance query-performance database-administration


【解决方案1】:

禁用索引

 SELECT 'ALTER INDEX [' + I.name + '] ON [' + T.name + '] DISABLE' query
        FROM sys.indexes I
        INNER JOIN sys.tables T on I.object_id = T.object_id
        WHERE i.type_desc in ('NONCLUSTERED')
        and I.name is not null  
        and T.name= <table_name>

启用索引

 SELECT DISTINCT OBJECT_NAME(b.OBJECT_ID) table_name, SCHEMA_NAME(schema_id) AS SCHEMA_NAME, c.name, CONCAT('Alter index ', c.name, ' on ', SCHEMA_NAME(schema_id),'.',OBJECT_NAME(b.OBJECT_ID), ' Rebuild') 
              AS query, c.type_desc
            FROM sys.tables b 
            JOIN sys.indexes c ON c.object_id = b.object_id 
            where c.type_desc in('NONCLUSTERED') 
            and b.name= <table_name>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2013-12-08
    • 2021-09-23
    • 2017-06-16
    • 2013-01-08
    相关资源
    最近更新 更多