2014-01-06 3 views
1

У меня есть хранимая процедура, и когда я хочу, чтобы выполнить его с помощью exec proc_name она занимает 1 минВыполнения хранимой процедуры занимает слишком много времени, чем выполнение TSQL

Если скопировать код из хранимой процедуры, объявить Params как переменные, а затем выполнить код занимает 10 секунд.

Что случилось?

У меня что-то отсутствует?

Я спрашиваю об этом, потому что я использую ADO.NET, и я получаю ошибку таймаута, когда хочу выполнить эту хранимую процедуру, используя ExecuteNonQuery.

Спасибо

+0

Вы определенно работаете против того же сервера? Та же база данных? –

+0

Подробнее о параметре sniffing – HLGEM

+0

http://www.sommarskog.se/query-plan-mysteries.html –

ответ

8

Его причиной являются субоптимальные планы. Вы упомянули, что s.p. имеет параметры, у меня были подобные проблемы из-за 'parameter sniffing'.

Самый быстрый чек, чтобы проверить, является ли это проблемой только для того, чтобы внутри SP скопировать входные параметры в локальные переменные, а затем использовать только локальные переменные.

Это останавливает, например, оптимизация для определенных значений параметров за счет других.

У меня было это раньше в s.p. который имел параметры int, где некоторые значения параметра немного изменили поток управления (а также как выполнялись запросы).

+0

Использование локальных переменных позволило решить мою проблему !!! – user3145

2

Start Sql Profiler и сравнить эти две казни: это дополнительные 50 минут провел на сервере? Действительно ли запросы одинаковы?

Вы можете скопировать фактический текст запроса и запустить его вручную и проверить план выполнения.

0

попробуйте выполнить proc с иконкой плана выполнения. Он скажет вам, какая именно часть требует времени, и вы/мы можем, вероятно, взять на себя (предложения) оттуда.

0

Как общая идея, query plans кэшируются по-разному, когда мы говорим об операциях adhoc и хранимых процедурах. Таким образом, время выполнения может отличаться, поскольку выбранный план запроса может отличаться.

Как предложения, я думаю, что по адресу:

1/Аннулируйте план запроса, связанный с этой хранимой процедуры:

sp_recompile <procname> 

2/Удалить все планы запросов из кэша (на жесткий путь, не рекомендуется в PROD, если вы не очень хорошо понимают последствия):

DBCC FREEPROCCACHE 

3/Update statistics для участвующих таблиц.

4/Посмотрите на фактический план выполнения для обоих случаев и укажите, где находится узкое место производительности. Отправьте код, и мы предоставим вам более подробную информацию.

Смежные вопросы