Я оптимизирую большой SP в Sql Server 2008, который использует много динамического Sql.Это запрос, который ищет в базе данных ряд необязательных параметров, и не хватает кодирования для каждой возможной комбинации параметров. Динамический sql оказался наиболее эффективным методом выполнения этого.Sql striung создается с параметрами и затем передается в sp_executesql со списком параметров.При запуске этого в SSMS с любой комбинацией параметров он выполняется очень быстро (<1 с) и возвращает результаты.Однако при запуске из приложения Windows Form это иногда занимает значительно больше времени. </p>
Я прочитал, что различие в параметре ARITHABORT может привести к этому (ВКЛ по умолчанию в SSMS и ВЫКЛ в ADO), однако я не уверен, какдля того, чтобы включить это, решает проблему или маскирует это?Разница в настройках влияет на сам запрос или просто означает, что Sql Server будет использовать разные кэшированные планы выполнения?Если это так, следует ли очистить кэш и статистику сбросить игровое поле?
Я также прочитал различные точки зрения на настройку OPTION RECOMPILE.Насколько я понимаю, когда sp_executesql используется со списком параметров, каждая комбинация параметров будет создавать плоскость выполнения, однако, поскольку возможные комбинации параметров конечны, это приведет к оптимизированным запросам.Другие источники говорят, что он должен быть установлен на ON в начале любого SP, который использует динамический sql.
Я понимаю, что в разных ситуациях требуются разные настройки, но я хочу разобраться в них, прежде чем пытаться использовать произвольно на моем очень занятомПроизводственный сервер 24х7.Извиняюсь за шалости, я думаю, мой вопрос сводится к:
Что заставляет sql работать по-разному в SSMS и Window Forms?Если это ARITHABORT, то это проблема, связанная с планами выполнения, или я должен включить ее как сервер по умолчанию?Каков оптимальный способ выполнения запросов с динамическим SQL?