0

因为我必须维护几个数据库和超过 1000 个重载 DML 操作的表,所以我想使用触发器自动将索引碎片级别保持在某个值以下。

只是认为我现在没有时间去做,所以不会提供我的代码。当然,我心中有一些通用的模式如何做到这一点。我能够构建一个触发器,我知道如何找到索引碎片值。但是如果没有大量的测试和大量的文档阅读,我不知道如何尽可能减少错误和最优化。这甚至可能是不可能的,因为我对触发器及其限制知之甚少,并且触发器中可能不允许执行此任务所需的某些操作。

例如,有些事情困扰着我:

  • 使用在线或离线索引
  • 这样的触发器是否会使查询崩溃
  • 由于超时,是否有可能在某些单行更新之后而不是在完整查询完成时执行触发,因此它不会因为索引重建而崩溃

那么如何以最优化的方式完成这样的任务呢?任何有关此类触发器如何影响查询性能的信息也将不胜感激。

编辑: 由于要求,我将提供一些代码。它可能是完整的解决方案,但在触发触发器时会生成错误消息:'无法在/使用表'schema.table'上执行 ALTER INDEX,因为该表是目标表或当前执行触发器的级联操作的一部分'

CREATE TRIGGER defragmentator ON [schema].[table]
AFTER INSERT, UPDATE
AS
    DECLARE @fragRate float;

    SELECT @fragRate = a.avg_fragmentation_in_percent
    FROM sys.dm_db_index_physical_stats (DB_ID(N'MyDB'), OBJECT_ID(N'[schema].[table]'), NULL, NULL, NULL) AS a
    JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
    WHERE b.name = 'IDX_name';

    IF @fragRate > 50
    ALTER INDEX IDX_name ON [schema].[table]
    REBUILD
GO

如何改善它?

4

1 回答 1

3

这是个坏主意。索引操作应在您的业务定义的维护时段内执行。具有预定作业的 SQL 代理是更可取的解决方案。

于 2013-09-16T16:35:38.260 回答