Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用存储在tempdb中的值更新同义词表_Sql Server_Linked Server_Synonym_Tempdb - Fatal编程技术网

Sql server 使用存储在tempdb中的值更新同义词表

Sql server 使用存储在tempdb中的值更新同义词表,sql-server,linked-server,synonym,tempdb,Sql Server,Linked Server,Synonym,Tempdb,我有一个关于同义词表更新的性能问题 我有两台SQL Server: 服务器A(2017年开发) 服务器B(2008 R2开发) 它们通过链接服务器进行通信(collation compatible=TRUE)。 我在服务器a上有一个日志表(比如T),在服务器B上有这个表的同义词 以下代码需要10秒来更新单个值(!) 执行计划: 但这段代码不到1秒 DECLARE @guid uniqueidentifier SET @guid = 'some value' UPDATE Log

我有一个关于同义词表更新的性能问题

我有两台SQL Server:

  • 服务器A(2017年开发)
  • 服务器B(2008 R2开发)
它们通过链接服务器进行通信(collation compatible=TRUE)。 我在服务器a上有一个日志表(比如T),在服务器B上有这个表的同义词

以下代码需要10秒来更新单个值(!)

执行计划:

但这段代码不到1秒

DECLARE @guid uniqueidentifier

SET @guid = 'some value'
    
UPDATE LogTable 
SET SizeKB=SizeKB+isnull(DATALENGTH('TEST VALUE')/1024.0,0) 
WHERE LogTable_guid=@guid
执行计划:

事件此代码花费的时间少于1

DECLARE @VAR nvarchar(max),@guid uniqueidentifier,@temp float

SET @VAR = 'TEST VALUE'
SET @guid = 'some value'

SELECT @temp = SizeKB
FROM LogTable 
WHERE LogTable_guid=@guid

SET @temp = @temp+isnull(DATALENGTH(@VAR)/1024.0,0)

UPDATE LogTable 
SET SizeKB=@temp 
WHERE LogTable_guid=@guid
执行计划:

我不是在寻找解决方法,而是想了解为什么DATALENGTH中的变量与只有变量值的变量在执行计划上存在差异


此行为不限于DATALENGTH。。我尝试了LEN()和SUBSTRING(),但它们都有前面提到的问题。

排序规则不匹配可能导致这种情况,因为SQL Server无法确定远程服务器在对字符串进行操作时是否会计算与本地相同的内容。检查服务器是否标记为“排序规则兼容”,如果标记为“兼容”,则检查服务器的排序规则是否匹配。通过将
COLLATE[collation]
添加到
@VAR
表达式中,您可能会看到一个改进,或者您可能不会看到。即使使用具有匹配排序规则的字符串,也很容易编造出碰巧不远程的表达式,这就是为什么在链接查询时要保守的原因。@Jeroenmoster感谢您的回复。链接服务器与排序规则兼容,数据库相同。它们是从相同的备份中恢复的,并使用相同的排序规则进行设置。我确实像你提到的那样尝试整理变量,但是仍然有相同的执行计划和延迟。
DECLARE @VAR nvarchar(max),@guid uniqueidentifier,@temp float

SET @VAR = 'TEST VALUE'
SET @guid = 'some value'

SELECT @temp = SizeKB
FROM LogTable 
WHERE LogTable_guid=@guid

SET @temp = @temp+isnull(DATALENGTH(@VAR)/1024.0,0)

UPDATE LogTable 
SET SizeKB=@temp 
WHERE LogTable_guid=@guid