小编sup*_*sor的帖子

为什么 SQL Server 在更新位列时扫描所有行,即使是通过链接服务器进行主键

我对 SQL 链接服务器的特定主键使用简单的更新语句,如下所示

UPDATE t
SET
    processed = 1,
    processed_on = GETDATE()
FROM [LINKED\SERVER].DATABASE.dbo.FileQueue t
WHERE t.FileId = '3b33eff6-fde1-4e8c-9c23-2dbd45f50222'
Run Code Online (Sandbox Code Playgroud)

两台服务器都是SQL Server 2019。表定义是

CREATE TABLE dbo.FileQueue
(
    FileId UNIQUEIDENTIFIER NOT NULL,
    Processed BIT NOT NULL,
    Processed_on DATETIME NULL
 CONSTRAINT PK_FileQueue PRIMARY KEY CLUSTERED 
 (
    FileId ASC
 )
)
Run Code Online (Sandbox Code Playgroud)

已处理列具有位类型。由于全表扫描,查询速度很慢。

查询计划

为什么会发生这种情况?当我从语句中删除位列时,读取和更新单个远程行一切正常。

Id列是聚集主键。我有很多带有相似键的表。

我尝试使用CONVERTorCAST函数,结果是相同的。

对于没有位列的查询,执行计划非常好。

UPDATE t
SET
    --processed = 1,
    -- any other columns can be added to be updated except bit
    processed_on = GETDATE()
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan linked-server update

9
推荐指数
1
解决办法
884
查看次数