2016-05-03 4 views
1

У меня есть запрос, который сразу получает результаты без EXEC sp_executesql, , но когда я использую sp_executesql, сервер sql использует другой план выполнения, и для получения результата требуется более 5 минут.sp_executesql использует неправильный план выполнения

Я также пробовал EXEC sp_updatestats и dbcc freeproccache, и все же sp_executesql выбирает неправильный план выполнения.

Когда я использую OPTION (RECOMPILE), он получает результат мгновенно, но я не хочу использовать OPTION (RECOMPILE) в каждом запросе.

Как я могу сделать sp_executesql, чтобы выбрать правильный план выполнения?

+0

какой план он использует, не используя 'sp_executesql'? какой план он использует? в чем разница, вызывающая разницу во времени, и разность входных параметров? – TZHX

ответ

1

Мой индекс был фильтрованного индекса и кажется sp_executesql не может использовать отфильтрованные индексы! я удалил фильтр из своего индекса и воссоздал его, и моя проблема была решена.

0

Проблема, которую вы описываете, вероятно, является результатом parameter sniffing. Вы должны проверить некоторые из этих существующих постов на эту тему:

+1

спасибо, параметр sniffing - это когда мы используем разные параметры, но мои параметры одинаковы для всех тестов, и даже после очистки ящика sp_executesql по-прежнему выбирает неправильный план. –

+0

@BanafsheAlipour Вы можете показать свой запрос? Имеет ли она «поймать всю» логику? Как 'where col = @ p ​​или @p имеет значение null? –

+0

мой запрос выглядит так: 'select count (*) из MyTable, где col1 = @ p0 и col2 = @ p1' –

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