Курсор SQL с хранимой процедурой и запрос с UDF - PullRequest
1 голос
/ 09 февраля 2009

Я пытаюсь оптимизировать хранимую процедуру, которую поддерживаю, и мне интересно, может ли кто-нибудь подсказать мне о преимуществах / недостатках производительности в приведенных ниже вариантах. Для моего решения мне в основном нужно запустить программу преобразования для изображения, хранящегося в столбце ИЗОБРАЖЕНИЕ в таблице. Процесс преобразования находится во внешнем .EXE-файле. Вот мои варианты:

  1. Перетащите результаты целевой таблицы во временную таблицу, а затем с помощью курсора перейдите по каждой строке таблицы и запустите хранимую процедуру в столбце ИЗОБРАЖЕНИЕ. Хранимая процедура вызывает .EXE.

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

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

Дополнительная информация:

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

Ответы [ 2 ]

1 голос
/ 10 февраля 2009

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

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

1 голос
/ 09 февраля 2009

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

...