Почему хранимой процедуре требуется вечное выполнение, но код в процедуре выполняется быстро сам по себе? - PullRequest
3 голосов
/ 24 ноября 2010

Во-первых, это Oracle. Если я сделаю это ...

execute my_package.sp_execute_my_procedure('...', '...');

Кажется, он работает бесконечно (я оставил его на ночь).

Однако, если я возьму код из хранимой процедуры, добавлю его в анонимный блок pl / sql, добавлю ключевое слово объявлять к моему единственному курсору и запустлю его, он завершится через 10 минут. Вот сколько времени это займет.

Не публикуя весь код, по крайней мере, сразу, кто-нибудь видел что-нибудь подобное?

ОБНОВЛЕНИЕ: Хорошо, поэтому я замечаю, что когда я выбираю из v $ session, во время выполнения процедуры я получаю «UNKNOWN» blocking_session_status с событием «прямая запись пути».

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

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Возможно, существует какой-то конфликт за объект пакета, который блокирует ваш сеанс, прежде чем он сможет даже запустить код.

Пока команда execute зависает, запросите V$SESSION, чтобы увидеть, что ожидает этот сеанс.

0 голосов
/ 24 ноября 2010

Однако, если я возьму код из хранимой процедуры, добавлю его в анонимный pl / sql блок, поместите ключевое слово объявлять на мой курсор и запустите его, он заканчивается как 10 минут.

...

Он в основном имеет большой выбор, затем для каждой строки в выборке он делает целую кучу Вставки.

Вы включили вставки или нет?

0 голосов
/ 24 ноября 2010

Использует ли ваш код PL / SQL переменную связывания, а ваш блок DECLARE использует литерал вместо него?Это может привести к другому плану и, следовательно, к другой производительности.

...