У меня есть 2 сервера, на которых установлен SQL-сервер и одна и та же база данных. В базе данных есть процедура хранения, которая на сервере A занимает 35 минут, а на сервере B - 9 часов. Процедура в основном обновляет несколько таблиц, но данные точно такие же, поэтому я не понимаю, почему разница во времени такая огромная.
Может ли кто-нибудь посоветовать мне фиктивный запрос, который я могу запустить на обоих серверах (не относящийся к текущим данным), чтобы сравнить производительность. например вставив 5 миллионов строк, а затем обновите их все.
Просто для информации, спецификация сервера B является более высокой спецификацией, индексация такая же в соответствующих таблицах, нет блокировки, пока сервер B SP выполняет
ну 9 часов хуже. 35 вполне приемлемо
Есть ли разница в версии sql server? план исполнения?
Это может быть что угодно. Вы запускали трассировку, чтобы найти медленные запросы? Как только вы это сделаете, вы можете получить план выполнения с обоих серверов для сравнения. Также проверьте @@VERSION
на обоих серверах и проверьте уровни совместимости.
Загрузите планы выполнения быстрого и медленного выполнения в brentozar.com/pastetheplan. Это поможет сузить причину до разных планов по сравнению с другими факторами.
ok будет делать, как только сервер освободится. Благодарность :)
Прошло три часа, вы еще не смогли выполнить свой запрос еще раз?
Извините, приведенное ниже предложение перекомпиляции сработало
Есть много возможностей, но если данные и оборудование должны быть одинаковыми в двух средах, то, возможно, происходит его анализ параметров?
В основном это означает, что при первом запуске процедуры план составляется с текущими параметрами, и этот план сохраняется вместе с процедурой. В следующий раз, когда вы запустите процедуру, она повторно использует старый план, который может быть очень плохим для нового параметра.
Вы можете попробовать добавить "WITH RECOMPILE", чтобы увидеть, сильно ли это изменит производительность.
ALTER PROCEDURE <procedure>
<Parameters>
WITH RECOMPILE
AS
Спасибо. Единственное, что я переместил ту же процедуру с сервера A на B. Никаких новых параметров не было добавлено и процедура не была изменена.
Это тот же код, но, как я уже сказал, когда вы вызываете процесс в первый раз, он сохраняет план, посмотрите ссылку на Брента Озара для лучшего объяснения: brentozar.com/archive/2013/06/…
35 минут - это тоже много времени ... может хранимая процедура написана плохо и ее можно улучшить?