Производительность хранимой процедуры по сравнению со скалярной функцией в Microsoft SQL Server - PullRequest
1 голос
/ 28 мая 2010

Меня интересует разница в производительности между хранимой процедурой и скалярной функцией. Сейчас я использую в основном скалярные функции, потому что я могу использовать их внутри других запросов (и 99% времени они все равно возвращают 1 значение). Но есть скалярные функции, которые я никогда не использую в других запросах, и обычно я вызываю их с помощью простой функции SELECT dbo.somefunction (параметр) и все.

Было бы лучше с точки зрения производительности перенести их в хранимую процедуру?

Ответы [ 2 ]

7 голосов
/ 28 мая 2010

Скалярные функции перекомпилируются при каждом вызове. Это потому, что они не могут быть включены в кэш плана, созданный из sql, обработанного оптимизатором / процессором запросов.

В тех случаях, когда вы вызываете udf только один раз (как в Select dbo.UDFName(params)), это действительно не имеет большого значения, но если вы используете скалярное значение udf в запросе, который проверяет миллион строк, udf будет скомпилирован миллион раз. Это определенно будет хитом производительности. Существует методика, при которой (если алгоритм может быть записан в структуре на основе множеств), вы можете преобразовать скалярные UDF-функции в так называемые строковые udf-выражения с табличными значениями, которые возвращают таблицы из одной строки / одного столбца ... включенные в sql запросы планируют кэши вместе с остальной частью sql, поэтому они не подвержены этому снижению производительности ...

2 голосов
/ 28 мая 2010

Здесь нет абсолютов, дьявол кроется в деталях. Наилучшим подходом является проверка конкретной ситуации путем изучения плана запроса и статистики.

Кроме того, независимо от того, является ли функция CLR или нет, разница может составлять несколько порядков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...