【问题标题】:Why update clause updates primary key index为什么update子句会更新主键索引
【发布时间】:2015-07-17 09:48:38
【问题描述】:

我有疑问

DECLARE @ids TABLE (
    id BIGINT
);
DECLARE @dtDateLimit DATETIME;
SET @dtDateLimit = DATEADD(MINUTE, (-1) * @ResignTimeout, GETDATE());

UPDATE queue_local
SET [status] = @QueueLocalStatusToSign
OUTPUT INSERTED.id INTO @ids
WHERE [status] = @QueueLocalStatusSigning
AND status_date < @dtDateLimit;

根据执行计划,此子句更新主键索引(在“id”列上)。 这种行为有原因吗?

我问是因为我在这个索引上遇到了类似更新的死锁

UPDATE TOP (1) queue_local
SET [status] =
                CASE
                    WHEN @SignError IS NULL THEN @QueueLocalStatusSigned
                    ELSE @QueueLocalStatusError
                END
OUTPUT INSERTED.id INTO @ql_ids
WHERE task_sign_id = @ts_id
AND sono = @Sono
AND [status] = @QueueLocalStatusSigning

我尝试了解服务器行为

【问题讨论】:

  • 表上的聚集索引是什么? (就此而言,表上的所有索引是什么)

标签: sql sql-server deadlock


【解决方案1】:

当您查看执行计划时。您看到 Operator Clustered Index 更新了吗?如果您有一个带有聚集索引的表,则聚集索引包含整个表。所以它需要经常更新。 另一方面,这并不意味着聚集索引 KEY 将被更新。如果在您的情况下,列 [status] 不是您的聚集索引键的一部分,则只会为匹配的行更新聚集索引的叶级别。 (如果没有发生分页)。

如果您在 [Status] 列上有一个非聚集索引,则 SQL Server 可以从那里查找到聚集索引的入口点 (id)。

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2021-09-16
    • 2019-12-24
    • 1970-01-01
    相关资源
    最近更新 更多