如何解决使用存储在tempdb中的值更新同义词表
我在更新同义词表方面遇到性能问题。
- 服务器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 举报,一经查实,本站将立刻删除。