Нет. 1 оптимизация - избавьтесь от КУРСОРА! :-) Вы выполняете это против множества разных таблиц ?? Можете ли вы как-нибудь избавиться от переменной @table ??
Объединение динамического SQL с курсором - верный способ уничтожить любые оптимизации, которые SQL Server мог бы использовать .......
Попробуйте запустить ядро вашего хранимого процесса с этой таблицей 1,5 млн. С жестко закодированным именем таблицы:
update (your table name)
set AuditData.TATCallType='12', AuditData.TATCallUnit='1'
from (your table name) AuditData
inner join AuditMaster am on am.ID=AuditData.AuditMaster_ID
...... (and so forth)
Сколько времени это занимает само по себе ??
Можете ли вы опубликовать немного больше информации? Табличные структуры, какие показатели доступны?
Марк
PS: я попытался разбить огромный оператор SQL и попытаться избежать CURSOR с помощью Common Table Expression. Однако для этого требуется, чтобы вы жестко закодировали имя @Table в своем утверждении - может ли это сработать для вас ??
Попробуй - сколько времени ты сейчас получаешь?
UPDATE
(your table name)
SET
AuditData.TATCallType='12', AuditData.TATCallUnit='1'
FROM
(your table name) AuditData
INNER JOIN
AuditMaster am ON am.ID = AuditData.AuditMaster_ID
INNER JOIN
HomeCircleMaster hcm ON hcm.Ori_CircleMaster_ID = am.CircleMaster_ID
AND hcm.Ori_ServiceTypeMaster_ID = 1
AND hcm.Dest_ServiceTypeMaster_ID = 1
INNER JOIN
AuditTaggingMaster atm ON atm.AuditMaster_ID = am.ID
INNER JOIN
NoSeriesMaster ns on (ns.CircleMaster_ID = am.CircleMaster_ID or ns.CircleMaster_ID = hcm.Dest_CircleMaster_ID)
AND ns.ProviderMaster_ID = am.ProviderMaster_ID
AND ns.ServiceTypeMaster_ID = 1
INNER JOIN
ProviderMaster_CallTypeMaster pm_ctm ON pm_ctm.ProviderMaster_ID = am.ProviderMaster_ID
AND pm_ctm.CallTypeMaster_ID = 101
AND pm_ctm.CallTypeTagValue = AuditData.CallTypeTag
INNER JOIN
NoSeriesMaster_Prefix PD ON SUBSTRING(AuditData.CallTo, 1, CONVERT(INT, PD.PrefixLen)) = PD.PrefixNo
AND LEN(AuditData.CallTo) = CONVERT(VARCHAR(10), CONVERT(INT, PD.PrefixLen) + CONVERT(INT, PD.AfterPrefixLen))
AND PD.PrefixNo + ns.NoSeries = LEFT(AuditData.CallTo, len(ns.NoSeries) + CONVERT(INT, PD.PrefixLen))
WHERE
AuditData.TATCallType is NULL
AND AuditData.AuditMaster_ID = @AuditMasterID
AND PD.PrefixType = 'SMS'
ЕСЛИ это работает, ваши следующие шаги будут проверять, есть ли у вас индексы для
все ваши условия JOIN, например,
ВНУТРЕННЕЕ СОЕДИНЕНИЕ AuditTaggingMaster atm ON atm.AuditMaster_ID = am.ID
есть ли у вас индексы для "atm.AuditMaster_ID" и "am.ID"?
ваши предложения WHERE (например, у вас есть индекс для PD.PrefixType?)
Кроме того, для каждого случая необходимо учитывать, насколько избирательным будет индекс. Например, в вашем предложении WHERE для PD.PrefixType = 'SMS' - это выбирает половину всех записей в таблице "PD" или просто 1-2%? Если индекс является выборочным, то он, скорее всего, будет использоваться - если он находится в столбце «BIT», который может иметь только два значения, и каждое значение выберет около половины таблицы, не беспокойтесь о размещении индекса там, он выиграл ничем не помог.