为什么更新子句更新主键索引
Why update clause updates primary key index
我有疑问
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
我尝试了解服务器行为
当你查看执行计划时。您看到运算符聚簇索引更新了吗?如果您的 table 带有聚簇索引,则聚簇索引包含整个 table。所以它需要经常更新。
另一方面,这并不意味着聚集索引 KEY 将被更新。如果在您的情况下,列 [status] 不是聚簇索引键的一部分,则只会为匹配行更新聚簇索引的叶级别。 (如果没有发生页面拆分)。
如果您在 [Status] 列上有一个非聚集索引,那么 SQL 服务器可以从那里查找聚集索引的入口点 (id)。
我有疑问
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
我尝试了解服务器行为
当你查看执行计划时。您看到运算符聚簇索引更新了吗?如果您的 table 带有聚簇索引,则聚簇索引包含整个 table。所以它需要经常更新。 另一方面,这并不意味着聚集索引 KEY 将被更新。如果在您的情况下,列 [status] 不是聚簇索引键的一部分,则只会为匹配行更新聚簇索引的叶级别。 (如果没有发生页面拆分)。
如果您在 [Status] 列上有一个非聚集索引,那么 SQL 服务器可以从那里查找聚集索引的入口点 (id)。