Каковы преимущества и недостатки реального мира в выполнении динамической команды SQL в хранимой процедуре в SQL Server с помощью
EXEC (@SQL)
против
EXEC SP_EXECUTESQL @SQL
?
Каковы преимущества и недостатки реального мира в выполнении динамической команды SQL в хранимой процедуре в SQL Server с помощью
EXEC (@SQL)
против
EXEC SP_EXECUTESQL @SQL
?
sp_executesql
, скорее всего, будет способствовать повторному использованию плана запроса. При использовании sp_executesql
параметры явно идентифицируются в вызывающей сигнатуре. Эта отличная статья описывает этот .
Часто цитируемой ссылкой для многих аспектов динамического sql является Erland Sommarskog, который должен читать: " Проклятие и благословения динамического SQL".
Большая проблема в SP_EXECUTESQL заключается в том, что он позволяет создавать параметризованные запросы, что очень хорошо, если вы заботитесь о внедрении SQL.
Microsoft Использование sp_executesql в статье рекомендуется использовать sp_executesql
вместо оператора execute
.
Поскольку эта хранимая процедура поддерживает замену параметров, sp_executesql более универсален, чем EXECUTE; и потому что sp_executesql создает планы выполнения, которые, скорее всего, будут повторно используется SQL Server, sp_executesql эффективнее, чем EXECUTE.
Итак, заберите: Не используйте оператор execute
. Используйте sp_executesql
.
В наши дни я всегда использовал sp_executesql, все, что он действительно представляет собой оболочку для EXEC, которая обрабатывает параметры и переменные.
Однако не забудьте о OPTION RECOMPILE при настройке запросов в очень больших базах данных, особенно там, где у вас есть данные, которые связаны с несколькими базами данных и используют CONSTRAINT для ограничения сканирования индексов.
Если вы не используете OPTION RECOMPILE, SQL-сервер попытается создать план выполнения "один размер подходит всем" для вашего запроса и будет запускать полное сканирование индекса каждый раз при его запуске.
Это гораздо менее эффективно, чем поиск, и означает, что он потенциально сканирует целые индексы, которые ограничены диапазонами, которые вы даже не запрашиваете: @
выполните команду
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@[email protected] !='')
begin
set @sql= @sql+' where PickupDay in ('''[email protected]+''','''[email protected]+''' )'
end
exec( @sql)