使用连接表函数输出和变量值更新表变量?

时间:2012-03-13 20:01:43

标签: sql-server performance sql-server-2008 sql-server-2005 tsql

给出下面的表变量,其中包含一些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

还是折腾?查询优化器是否足够智能以缓存表函数的输出,或者它是否会为正在更新的每一行旋转执行函数的轮子?

1 个答案:

答案 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 ...

一样