问题描述
我在更新同义词表方面遇到性能问题。
- 服务器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
但是这段代码不到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(),它们都具有与上述相同的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)