Выбрать главу

Общая стоимость запроса составляет три единицы работы, как показано

в стоимостной части, расположенной справа от операции 0 в плане выполнения

(0 SELECT STATEMENT C o s t = 3). Единица работы представляет собой

объём вычислений, который программное обеспечение должно выполнить

для заданной операции. Чем больше стоимость, тем больше работы

должно выполнить программное обеспечение для завершения выражения

SQL.

Примечание Если вы используете версию базы данных, предшествующую OraclelOg, то выходные

данные для стоимости всей операции могут отсутствовать. Это связано с тем, что более

ранние версии базы данных не вели автоматического сбора статистики таблиц. Чтобы начать

сбор статистики, необходимо использовать команду ANALYZE, (см. ниже в разделе “Сбор статистики

о таблицах").

Планы выполнения, включающие соединение таблиц

Планы выполнения для соединений таблиц являются более сложными.

В следующем примере генерируется план выполнения для запроса, в котором

выполняется соединение таблиц products и product_types:

□ EXPLAIN PLAN SET STATEMENT_ID = 'PRODUCTS’ FOR

SELECT p.name, pt .name

616 Глава 16

FROM p r o d u c t s p, p r o d u c t _ t y p e s pt

WHERE p . p r o d u c t _ t y p e _ id = p t . p r o d u c t _ t y p e s _ id ;

План выполнения для э т о г о за пр о са выглядит следующим образом:

@ c : \ 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 : PRODUCTS

EXECUTION_PLAN

0 SELECT STATEMENT C o s t = 6

1 MERGE JOIN C o s t = 1

2 TABLE ACCESS BY INDEX ROWID PRODUCT_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

Примечание Если вы выполните этот пример, у вас может получиться несколько другой

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

параметров в конфигурационном файле базы данных init.ora.

На этот раз план выполнения более сложный, и можно видеть иерархические

взаимоотношения .между различными операциями. В этом примере

операции выполняются в следующем порядке: 3 ,2 ,5 ,4 ,1 иО .В таблице

16.2 операции описаны в порядке выполнения.

Таблица 16.2. Операции плана выполнения

Идентифика- Описание

тор операции__________________________

3 Полное сканирование индекса product_types_pk (который является уникальным

индексом) для получения адресов строк из таблицы product_types. Адреса

получают в виде значений R0WID, которые передаются в операцию 2.

2 Получение доступа к строкам таблицы product_types с использованием значений

R0WID, переданных из операции 2. Строки передаются в операцию 1.

5 Получение доступа к строкам таблицы products, которые передаются в операцию

4.

4 Сортировка строк, полученных из операции 5, которые затем будут переданы

в операцию 1.

1 Слияние строк, переданных из операций 2 и 5. Слитые строки передаются в

операцию 0.

0 Возвращает полученные при выполнении операции 1 пользователю. Полная

стоимость операции SELECT равна 6 единицам работы.___________________

Сбор статистики о таблицах

Если вы используете базу данных версии, предшествующей OraclelOg (например,

91), вы должны самостоятельно собирать статистику о таблицах,

используя команду ANALYZE. По умолчанию в тех случаях, когда статистика

отсутствует, используется оптимизатор по правилам. Обычно оптимизация

по правилам оказывается хуже стоимостной оптимизации.

В следующем примере команда ANALYZE используется для сбора статистики

о таблицах p r o d u c t s и p r o d u c t_ t y p e s :

Настройка высокой производительности SQL 617

П ANALYZE TABLE p r o d u c t COMPUTE STATISTICS;

ANALYZE TABLE p r o d u c t j t y p e s COMPUTE STATISTICS;

После того как будет собрана статистика, будет использоваться стоимостная

оптимизация, а не оптимизация по правилам.

Сравнение планов выполнения

Путем сравнения присутствующей в плане выполнения полной стоимости

выполнения различных операторов SQL можно оценить значение настройки

ваших операторов SQL. В этом разделе сравниваются два плана

выполнения, что поможет увидеть преимущества применения ключевого

слова EXISTS вместо DISTINCT (см. выше). Следующий пример генерирует

план выполнения для запроса с использованием EXISTS:

□ EXPLAIN PLAN SET STATEMENT_ID = ' EXISTS_QUERY' FOR

SELECT p r o d u c t _ id , паше

FROM p r o d u c t s o u t e r

WHERE EXISTS

(SELECT 1

FROM p u r c h a s e s in n e r

WHERE i n n e r . p r o d u c t ' i d ‘ = o u t e r . p r o d u c t _ i d ) ;

План выполнения для э т о г о оператора выглядит следующим образом:

@ с :\sql_book\sql\explain_plan. sql

E n t e r v a lu e f o r v _ s t a t em e n t _ id : EXISTS_QUERY

EXECUTION PLAN

0 SELECT STATEMENT C o s t = 4

1 MERGE JOIN SEMI C o s t = 1