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

问题描述

我在更新同义词表方面遇到性能问题。

我有两个sql Server:

  • 服务器A(2017 DEV)
  • 服务器B(2008 R2 DEV)

,它们通过链接的服务器进行通信(排序规则兼容= TRUE)。 我在服务器A上有一个日志表(假设为T),在服务器B上有此表的同义词。

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

DECLARE @VAR nvarchar(max),@guid uniqueidentifier

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

UPDATE LogTable 
SET SizeKB=SizeKB+isnull(DATALENGTH(@VAR)/1024.0,0) 
WHERE LogTable_guid=@guid

执行计划:

enter image description here

但是这段代码不到1秒的时间

DECLARE @guid uniqueidentifier

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

执行计划:

enter image description here

代码占用的时间少于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

执行计划:

enter image description here

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

这种行为不仅限于DATALENGTH。我尝试了LEN()和SUBSTRING(),它们都具有与上述相同的问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)