为批量删除操作禁用和启用或删除和创建非聚集索引

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于为批量删除操作禁用和启用或删除和创建非聚集索引的主要内容,如果未能解决你的问题,请参考以下文章

聚集索引和非聚集索引中使用的数据结构

聚簇索引与非聚簇索引的区别

聚集索引和非聚集索引

聚集和非聚集索引 - SQL Server 和 Oracle?

SQL Server的聚集索引和非聚集索引

聚集索引与非聚集索引