Объяснить план запроса в хранимой процедуре - PullRequest
8 голосов
/ 23 сентября 2008

У меня есть хранимая процедура, которая состоит из одного запроса на выборку, который используется для вставки в другую таблицу на основе некоторой незначительной математики, выполняемой с аргументами в процедуре. Могу ли я сгенерировать план, используемый для этого запроса, как-то ссылаясь на процедуру, или мне нужно скопировать и вставить запрос и создать переменные связывания для входных параметров?

Ответы [ 3 ]

7 голосов
/ 23 сентября 2008

Используйте SQL Trace и TKPROF . Например, откройте SQL * Plus и введите следующий код: -

alter session set tracefile_identifier = 'something-unique'
alter session set sql_trace = true;
alter session set events '10046 trace name context forever, level 8';

select 'right-before-my-sp' from dual;
exec your_stored_procedure

alter session set sql_trace = false;

Как только это будет сделано, посмотрите в каталоге UDUMP вашей базы данных файл TRC с «нечто уникальным» в имени файла. Отформатируйте этот файл TRC с помощью TKPROF, а затем откройте отформатированный файл и найдите строку «right-before-my-sp». Команда SQL, введенная вашей хранимой процедурой, должна быть вскоре после этого раздела, и сразу под этим оператором SQL будет план для оператора SQL.

Редактировать: В целях полного раскрытия, я должен поблагодарить всех тех, кто дал мне ответы на эту тему на прошлой неделе, которые помогли мне научиться делать это.

1 голос
/ 23 сентября 2008

Многие инструменты, такие как Toad или SQL Developer, будут запрашивать значения переменных связывания при выполнении плана объяснения. Вам придется сделать это вручную в SQL * Plus или других инструментах.

Вы также можете включить трассировку SQL и выполнить хранимую процедуру, а затем извлечь план объяснения из файла трассировки.

Будьте внимательны, чтобы не просто получить план объяснения для оператора SELECT. Наличие предложения INSERT может изменить цель оптимизатора с первых строк на все строки.

1 голос
/ 23 сентября 2008

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

Текущий ответ НЕТ, вы не можете запустить его с процедурой, и вы должны запустить его против самих отдельных операторов. Сложно, когда у вас есть переменные и вычисления, но это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...