2010-05-28 3 views
1

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

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

ответ

7

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

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

+1

Не стоит недооценивать то, что сказал Чарльз. UDF великолепны, но они могут быть огромным и ожидаемым, узким местом производительности. –

2

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

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

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