SQL Server StoredProc против встроенной таблицы UDF - PullRequest
0 голосов
/ 03 октября 2009

Я написал сложный запрос, который вернет мне список идентификаторов. Теперь я хочу повторно использовать этот запрос, чтобы объединить результаты с другим запросом. Для этого я планирую поместить это в Stored Proc или UDF, а затем использовать для вставки во временную таблицу.

что-то вроде ниже

1) Поместите запрос в сохраненный процесс и вставьте его во временную таблицу

INSERT INTO #TEMP
EXEC SP_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

2) Поместите запрос в UDF и вставьте его во временную таблицу

INSERT INTO #TEMP
SELECT ID_LIST FROM DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN)

Я не вижу разницы в значимости между этими двумя, когда я запускаю их для результата 1000 идентификаторов. Но в реальной реализации результатом может быть миллион строк.

Для производительности, что было бы лучше?

Ответы [ 2 ]

2 голосов
/ 03 октября 2009

Вместо того, чтобы угадывать, я предлагаю вам сравнить планы выполнения для обоих методов.

Пользовательские функции могут быть удобно, иногда они могут заставить производительность страдать. это проблема с ними в том, что они используют построчная обработка, похожая на курсор, а не на основе набора операция. Так что если результат набора ваш запрос, то производительность Воздействие будет небольшим. Но если результирующий набор велик, то производительность вполне может стать проблемой. Вообще говоря, если вы используете пользовательская функция, вы хотите избегать их использования с большим результатом наборы. Вместо этого используйте хранимую процедуру.

Одним из способов повышения производительности скалярных функций, определяемых пользователем, является их преобразование в таблицы.

0 голосов
/ 06 октября 2009

Я обнаружил, что использование встроенной табличной функции и непосредственное присоединение к ней - лучший и эффективный вариант, чем варианты, которые я задал в вопросе. Что-то вроде

SELECT MYTABLE.MYFIELD FROM MYTABLE, DBO.UDF_COMPLEX(@PARAM1,@PARAM2...@@PARAMN) MYQUERY
WHERE MYTABLE.KEYVALUE = MYQUERY.KEYVALUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...