Курсор SQL с хранимой процедурой и запрос с UDF

Я пытаюсь оптимизировать хранимую процедуру, которую я поддерживаю, и мне интересно, может ли кто-нибудь рассказать мне о преимуществах/штрафах производительности для приведенных ниже параметров. Для моего решения мне в основном нужно запустить программу преобразования изображения, хранящегося в столбце IMAGE в таблице. Процесс преобразования находится во внешнем файле .EXE. Вот мои варианты:

  1. Извлеките результаты целевой таблицы во временную таблицу, а затем используйте курсор, чтобы пройтись по каждой строке в таблице и запустить хранимую процедуру для столбца IMAGE. Сохраненный процесс обращается к .EXE.

  2. Создайте пользовательскую функцию, которая вызывает файл .EXE, и выполните запрос SQL, аналогичный «выберите UDFNAME (Image_Col) из TargetTable».

Я думаю, что я ищу, это представление о том, сколько накладных расходов будет добавлено созданием курсора, вместо того, чтобы делать это как набор?

Некоторая дополнительная информация:

  • Размер набора в этом случае макс. 1000
  • Как упоминается в ответе ниже, если это делается как набор с UDF, будет ли это означать, что внешняя программа открывается 1000 раз одновременно? Или есть оптимизации для этого? Очевидно, что в многопроцессорной системе может быть неплохо иметь несколько запущенных экземпляров процесса, но 1000 может быть многовато.

person Sam Schutte    schedule 09.02.2009    source источник


Ответы (2)


определить базу набора в этом контексте? Если у вас есть 100 строк, будет ли это открывать приложение 100 раз за один раз? Я бы сказал тест, и только потому, что вы можете вызвать расширенный процесс из UDF, я бы все равно использовал для этого курсор, потому что в этом случае набор не имеет значения, поскольку вы не манипулируете данными в таблицах напрямую

person SQLMenace    schedule 09.02.2009

Я провел небольшое тестирование и эксперименты, и когда это делается в UDF, он действительно обрабатывает каждую строку за раз - SQL-сервер не запускает 100 процессов для каждой из 100 строк (я не думал, что это будет).

Тем не менее, я по-прежнему считаю, что делать это как UDF, а не как курсор, было бы лучше, потому что мои исследования, как правило, показывают, что дополнительные накладные расходы, связанные с необходимостью извлечения данных в курсоре, замедлят работу. Это может не иметь большого значения, но может сэкономить время по сравнению с тем, чтобы сначала извлечь все данные во временную таблицу.

person Sam Schutte    schedule 10.02.2009