给出下面的表变量,其中包含一些10K记录:
DECLARE @SomeTable TABLE
(
ID int IDENTITY (1, 1) PRIMARY KEY NOT NULL,
Name varchar(100),
CustomerMailingAddress1 varchar(100),
CustomerMailingAddress2 varchar(100),
CustomerMailingAddress3 varchar(100),
CustomerMailingAddress4 varchar(100),
ContactInfo1 nvarchar(256),
ContactInfo2 nvarchar(256)
)
目前,表变量在sproc中更新,如下所示:
UPDATE st
SET
ContactInfo1 = ci.ContactInfo1,
ContactInfo2 = ci.ContactInfo2
FROM @SomeTable st, dbo.ContactInfoFunc() AS ci
表函数dbo.ContactInfoFunc()
只是根据具有单个记录的表的主键检索MAX
记录(它的公司联系信息很少会发生变化)。
性能方面是以上更新更贵?换句话说,重写更新以消除表函数输出的连接是否有任何好处,如下所示:
DECLARE @ContactInfo1 nvarchar(256), @ContactInfo2 nvarchar(256)
SELECT @ContactInfo1 = ContactInfo1, @ContactInfo2 = ContactInfo2
FROM dbo.ContactInfoFunc()
UPDATE st
SET
ContactInfo1 = @ContactInfo1,
ContactInfo2 = @ContactInfo2
FROM @SomeTable st
还是折腾?查询优化器是否足够智能以缓存表函数的输出,或者它是否会为正在更新的每一行旋转执行函数的轮子?
答案 0 :(得分:1)
不确定您对表变量做了什么,但为什么还需要更新它?让我们假设你最后最终会从中做SELECT
。所以你的代码很容易:
DECLARE @ContactInfo1 nvarchar(256), @ContactInfo2 nvarchar(256)
SELECT @ContactInfo1 = ContactInfo1, @ContactInfo2 = ContactInfo2
FROM dbo.ContactInfoFunc();
...
SELECT
ID,
Name,
CustomerMailingAddress1,
CustomerMailingAddress2,
CustomerMailingAddress3,
CustomerMailingAddress4,
ContactInfo1 = @ContactInfo1, -- these don't need to be a fixture in the table to
ContactInfo2 = @ContactInfo2 -- be involved in the resultset or other activity...
FROM @SomeTable;
现在,如果函数实际采用参数,我的答案会有所不同,输出依赖于这些参数。那么执行一个CROSS APPLY
可能是有意义的......但是再次不执行UPDATE
,就像最后SELECT
...