Итак, я сделал некоторые изменения в хранимой процедуре, которые у нас есть, и теперь требуется 3 часа для запуска (раньше она занимала всего 10 минут). У меня есть временная таблица с именем #tCustomersEmail
. В нем есть столбец с именем OrderDate
, в котором много нулевых значений. Я хочу заменить эти нулевые значения данными из другой базы данных на другом сервере. Итак, вот что у меня есть:Как повысить производительность этой хранимой процедуры?
создать еще одну временную таблицу:
Create Table #tSouth
(
CustID char(10),
InvcDate nchar(10)
)
Что я заполнить с этими данными:
INSERT INTO #tSouth(CustID, InvcDate)
SELECT DISTINCT
[CustID],
max(InvcDate) as InvcDate
FROM D3.SouthW.dbo.uc_InvoiceLine I
where EXISTS (SELECT CustomerNumber FROM #tCustomersEmail H WHERE I.CustID = H.CustomerNumber)
group BY I.CustID
Тогда я беру данные из #tSouth
и обновления OrderDate
в #tCustomersEmail
стол, если CustomerNumber
соответствует, и OrderDate
недействителен:
UPDATE #tCustomersEmail
SET OrderDate = InvcDate
FROM #tCustomersEmail
INNER JOIN #tSouth ON #tCustomersEmail.CustomerNumber = [#tSouth].CustID
where #tCustomersEmail.OrderDate IS null
внесения этих изменений вызвали хранимую процедуру принять FOR-EV-ER (пустырь ссылку!)
Так, что я делаю неправильно?
BTW создать индексы моих временных таблиц после того, как я создаю их так:
create clustered index idx_Customers ON #tCustomersEmail(CustomerNumber)
CREATE clustered index idx_CustSouthW ON #tSouth(CustID)
Почему все временные таблицы? Если вы злоупотребляете ими, у вас будет узкое место в вашем tempdb. – Oded
Потому что я не могу поставить индексы на реальные таблицы. – broke
Вы создаете временные таблицы ** внутри ** ваш сохраненный proc? Это может привести к перекомпиляции proc - несколько раз. –