sup*_*sor 9 sql-server execution-plan linked-server update
我对 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
列是聚集主键。我有很多带有相似键的表。
我尝试使用CONVERT
orCAST
函数,结果是相同的。
对于没有位列的查询,执行计划非常好。
UPDATE t
SET
--processed = 1,
-- any other columns can be added to be updated except bit
processed_on = GETDATE()
FROM [LINKED\SERVER].DATABASE.dbo.FileQueue t
WHERE t.FileId = 'ABD4442F-8560-43B5-8B04-000000B2A626'
Run Code Online (Sandbox Code Playgroud)
理想情况下,您可以调用远程服务器上的存储过程来进行此修改,并将 UUID 作为参数。
同时,尝试使用变量作为bit
常量:
DECLARE @true bit = 1;
UPDATE t
SET processed = @true,
processed_on = GETDATE()
FROM [LINKED\SERVER].DATABASE.dbo.Queue t
WHERE
t.Id = CONVERT(uniqueidentifier, '3b33eff6-fde1-4e8c-9c23-2dbd45f50222');
Run Code Online (Sandbox Code Playgroud)
或者,如果您的链接服务器配置为RPC OUT
,则使用EXECUTE...AT
:
DECLARE
@id uniqueidentifier = {GUID '3b33eff6-fde1-4e8c-9c23-2dbd45f50222'},
@processed bit = 1,
@processed_on datetime = GETDATE();
EXECUTE
(
-- Parameterized statement
N'
UPDATE [DATABASE].dbo.Queue
SET processed = ?,
processed_on = ?
WHERE Id = ?',
--- Parameter values
@processed,
@processed_on,
@id
)
AT [LINKED\SERVER];
Run Code Online (Sandbox Code Playgroud)
在远程服务器上捕获的计划:
如果您需要在没有 RPC 的单个本地语句中使用它:
UPDATE t
SET processed = V.processed,
processed_on = GETDATE()
FROM [LINKED\SERVER].DATABASE.dbo.Queue AS t
CROSS JOIN (VALUES(1)) AS V (processed)
WHERE
T.Id = CONVERT(uniqueidentifier, '3b33eff6-fde1-4e8c-9c23-2dbd45f50222');
Run Code Online (Sandbox Code Playgroud)
SQL Server 使用称为分布式查询(DQ)的框架将 SQL 转换为远程服务器可以理解的形式。DQ 中的某些功能比其他功能更好。数据bit
类型总是有点奇怪。
这当然是一个错误。如果您想报告此问题,可以按照常规方式通过 Microsoft 支持进行报告,或者访问https://aka.ms/sqlfeedback
归档时间: |
|
查看次数: |
884 次 |
最近记录: |