Учитывая следующую табличную переменную, которая содержит, скажем, несколько записей по 10 КБ:
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
Или это жеребьевка? Будет ли оптимизатор запросов достаточно умен, чтобы кэшировать выходные данные табличной функции, или он будет крутиться, выполняя функцию для каждой обновляемой строки?