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
或者是一個難以取捨?查詢優化器是否足夠聰明,可以緩存表函數的輸出,或者它是否會爲正在更新的每一行執行函數?
將函數的相同輸出存儲在*每個表格的排?爲什麼不把這些常量在最終查詢中拉出來呢? – 2012-03-13 20:05:12
@AaronBertrand:這就是我想知道的,似乎將它們粘在變量中並在更新中分配一次會更好,尤其是因爲該函數只會返回一對值。 – 2012-03-13 20:10:40
仍然不明白你爲什麼需要* UPDATE *?如果每行被分配相同的值,那麼該列在該表中的用途是什麼? – 2012-03-13 20:11:48