0

考慮下面的表變量,它包含了讓我們說一些10K記錄:使用連接的表函數輸出與變量值更新表變量?

UPDATE st 
SET 
    ContactInfo1 = ci.ContactInfo1, 
    ContactInfo2 = ci.ContactInfo2 
FROM @SomeTable st, dbo.ContactInfoFunc() AS ci 

表功能dbo.ContactInfoFunc()簡單檢索MAX

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) 
) 

目前如下表變量被一個存儲過程中更新根據表單的主鍵記錄一條記錄(這是公司聯繫信息,很少有變化)。

性能方面是上述更新更貴嗎?換句話說,會有什麼好處重寫更新消除了加入表函數的輸出如下:

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

將函數的相同輸出存儲在*每個表格的排?爲什麼不把這些常量在最終查詢中拉出來呢? – 2012-03-13 20:05:12

+0

@AaronBertrand:這就是我想知道的,似乎將它們粘在變量中並在更新中分配一次會更好,尤其是因爲該函數只會返回一對值。 – 2012-03-13 20:10:40

+0

仍然不明白你爲什麼需要* UPDATE *?如果每行被分配相同的值,那麼該列在該表中的用途是什麼? – 2012-03-13 20:11:48

回答

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一樣......