где
■ идент опер - это имя, назначенное вами для плана выполнения. Имя
может быть буквенно-цифровым;
■ onepaTop_SQL - это текст оператора SQL, план выполнения которого
необходимо сгенерировать.
В следующем примере команда EXPLAIN PLAN пополняет таблицу планов
планом выполнения запроса, который выбирает все строки из таблицы
customers (statement_id равно CUSTOMERS):
П EXPLAIN PLAN SET STATEMENT_ID = 'CUSTOMERS' FOR
SELECT c u s tom e r _ id , f i r s t _ n am e , la s t_ n ame FROM cu s tome r s ;
Explained
После выполнения этого оператора можно изучить план выполнения,
записанный в таблицу планов. Далее вы увидите, как это сделать.
Примечание Оператор SELECT в тексте оператора EXPLAIN PLAN на самом деле не возвращает
никаких строк из таблицы customers. Оператор EXPLAIN PLAN просто генерирует план
выполнения, который будет использоваться при каждом реальном выполнении оператора
SELECT.
Выполнение запроса к таблице планов
Чтобы задавать запросы к таблице планов, автор составил сценарий
SQL*Plus explain_plan.sql и поместил его в каталог SQL. Сценарий предложит
вам указать значение для statement_id, а затем выведет план выполнения
для связанного с ним оператора.
614 Глава 16
Сценарий explain_plan.sql выглядит следующим образом:
□ - - Сценарий e x p l a i n _ p l a n . s q l выводит
— план выполнения для з аданно го s t a t em e n t _ id )
UNDEFINE v _ s t a t em e n t _ id ;
SELECT
i d | |
DEC0DE( i d , 0, " , LPAD(' 2 * ( l e v e l - 1 ))) II ' ' I I
o p e r a t io n || ' ' I I
o p t i o n s 1 1 ' ' I I
o b je c t_ n ame II ' ' I I
o b j e c t _ t y p e || ' ', 'C o s t = ' | l p o s i t i o n )
DECODE ( c o s t , NULL, ' 'C o s t = ' || p o s i t i o n )
AS e x e c u t io n _ p la n
FROM p l a n _ t a b l e
C0NNECT_BY PRIOR i d = p a r e n t _ id
AND s t a t em e n t _ id = '& & v _ s t a t em e n t _ id ' ;
START WITH i d = 0
AND s t a t em e n t _ id = & v _ s t a t e r n e n t _ id ';
Хранящийся в таблице планов план выполнения, подобно дереву, организован
в иерархию операций. Операция, имеющая значение столбца id,
равное 0, является корнем иерархии, и от нее ведут свое происхождение
все другие операции в плане. Оператор SELECT в сценарии explain_plan.sql
показывает операции, выполняемые в плане выполнения, начиная с операции,
имеющей значение id = 0, и осуществляя навигацию вниз по иерархии
отношений между каждой из операций.
В следующем примере показано, как выполнить сценарий explain_plan.
sql, чтобы получить созданный ранее план для запроса к таблице customers
(этот план имеет statementjd, равный CUSTOMERS):
□ SQL> @с:\ s q l _ b o o k \ s q l \ e x p l a i n _ p l a n . s q l
E n t e r v a lu e f o r v _ s t a t em e n t _ id : CUSTOMERS
o ld 12: s t a t em e n t _ id = ‘ & & v _ s t a tem e n t_ id ’
new 12: s t a t em e n t _ id = ‘ CUSTOMERS'
o l d 14: s t a t em e n t _ id =’ & v _ s t a t em e n t _ id ’
new 14: s t a t em e n t _ id =’ CUSTOMERS’
EXECUTION_PLAN
0 SELECT STATEMENT Cost =3
1 TABLE ACCESS FULL CUSTOMERS TABLE Cost = 1
Операции, показанные в столбце EXECUTION_PLAN, выполняются в следующем
порядке.
■ Операция с самым большим отступом вправо выполняется первой,
следом за ней выполняются любые родительские операции над ней,
■ Для операций с одинаковым отступом первой выполняется самая
верхняя операция, следом за ней выполняются любые родительские
операции над ней.
Каждая операция возвращает свои результаты в цепочку для своей непосредственной
родительской операции; после этого выполняется «родитель».
Настройка высокой производительности SQL 615
В столбце EXECUTION_PLAN идентификатор операции показан в крайней левой
позиции. В примере плана выполнения первой выполняется операция
1, причем результаты ее выполнения передаются операции 0. В следующем
примере показан порядок выполнения для более сложного случая:
□ О SELECT STATEMENT C o s t = 6
1 MERGE JOIN C o s t = 1
2 TABLE ACCESS BY INDEX ROWID PR0DUCT_TYPES TABLE C o s t = 1
3 INDEX FULL SCAN PRODUCT_TYPES_PK INDEX (UNIQUE) C o s t = 1
4 SORT JOIN C o s t = 2
5 TABLE ACCESS FULL PRODUCTS TABLE C o s t = 1
В этом примере операции производятся в следующем порядке: 3, 2, 5,4,
1, 0 .
Теперь, когда вы увидели порядок выполнения операций, пора посмотреть,
что конкретно эти операции делают. План выполнения для запроса
‘CUSTOMERS’ был таким
П 0 SELECT STATEMENT C o s t = 3
1 TABLE ACCESS FULL CUSTOMERS TABLE C o s t = 1
Первой выполняется операция 1, затем результаты этой операции передаются
в операцию 0. Операция 1 включает полное сканирование таблицы
customers, что показано строкой TABLE ACCESS FULL. Так выглядит первоначальная
команда, которая была использована для создания запроса
‘CUSTOMERS’ :
П EXPLAIN PLAN SET STATEMENT_ID = 'CUSTOMERS’ FOR
SELECT c u s tom e r _ id , f i r s t _ n am e , la s t_ n ame FROM c u s tome r s ;
Полное сканирование таблицы осуществляется потому, что выражение
SELECT предусматривает извлечение всех строк из таблицы customers.