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

2 TABLE ACCESS BY INDEX ROWID PRODUCTS TABLE C o s t = 1

3 INDEX FULL SCAN PRODUCTS_PK INDEX (UNIQUE) C o s t = 1

4 SORT UNIQUE C o s t = 2

5 INDEX FULL SCAN PURCHASES_PK INDEX (UNIQUE) C o s t = 1

Полная стоимость выполнения запроса составляет 4 единицы работы.

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

используется ключевое слово DISTINCT:

□ EXPLAIN PLAN SET STATEMENT_ID = ' DISTINCT JH J E R Y - FOR

SELECT DISTINCT p r . p r o d u c t _ id , pr .name

FROM p r o d u c t s pr , p u r c h a s e s pu

WHERE p r . p r o d u c t _ i d = p u . p r o d u c t _ 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 : DISTINCT_QUERY

EXECUTION_PLAN

0 SELECT STATEMENT C o s t = 5

1 HASH UNIQUE C o s t = 1

2 MERGE JOIN C o s t = 1

3 TABLE ACCESS BY INDEX ROWID PRODUCTS TABLE C o s t = 1

4 INDEX FULL SCAN PRODUCTS_PK INDEX (UNIQUE) C o s t = 1

5 SORT JOIN C o s t = 2

6 INDEX FULL SCAN PURCHASES_PK INDEX (UNIQUE) C o s t = 1

618 Глава 16

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

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

доказывают, что лучше использовать EXISTS вместо DISTINCT.

Передача подсказок оптимизатору

Оптимизатору можно передавать подсказки. Подсказкой (hint) называется

директива оптимизатора, оказывающая влияние на выбор оптимизатором

плана выполнения. Правильная подсказка может повысить производительность

оператора SQL. Эффективность подсказки можно проверить,

сравнив стоимости планов выполнения оператора SQL с подсказкой и без

нее.

В этом разделе приведен пример запроса, в котором используется одна

из наиболее полезных подсказок: подсказка FIRST_ROWS(n). Эта подсказка

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

время, затрачиваемое на получение первых п строк запроса. Это

может оказаться полезным, если вы не хотите слишком долго ожидать получения

хоть каких-то результатов запроса, но хотите в итоге увидеть все

его строки.

Следующий оператор использует подсказку FIRST_R0W( 2 ) . Обратите внимание:

подсказка помещается между строками /*+ и */:

П EXPLAIN PLAN SET STATEMENT_ID = ’ HINT ’ FOR

SELECT /*+ FIRST_R0WS(2) */ p.name, pt .name

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 _ id ;

Предупреждение Подсказка должна в точности соответствовать показанному синтаксису, так

как в противном случае она будет проигнорирована. Синтаксис таков: символы /*+, за которыми

следует один пробел, текст подсказки, за которым снова следует один пробел, и символы */.

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

внимание, что его стоимость равна 4 единицам работы:

П @ 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 : HINT

EXECUTION_PLAN

0 SELECT STATEMENT C o s t = 4

1 NESTED LOOPS

2 NESTED LOOPS C o s t = 1

3 TABLE ACCESS FULL PRODUCTS TABLE C o s t = 1

4 INDEX UNIQUE SCAN PRODUCT_TYPES_PK INDEX (UNIQUE) Cost = 2

5 TABLE ACCESS BY INDEX ROWID PRODUCT_TYPES TABLE C o s t = 2

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

но без подсказки:

□ EXPLAIN PLAN SET STATEMENT_ID = ' N0_HINT' FOR

SELECT p.name, pt.name

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

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

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 _ id ;

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

внимание на стоимость - 6 единиц работы (выше, чем для запроса

с подсказкой):

□ @ 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 : N0_HINT

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

Эти результаты показывают, что добавление подсказки уменьшает стоимость

выполнения запроса на 2 единицы работы.

Существует большое число подсказок, которые вы можете использовать.

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

почувствовать вкус их применения.

Дополнительные инструментальные средства настройки

В этом заключительном разделе я упомяну о некоторых других инструментальных

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

их использование и не умещается в рамки этой книги. Вы можете прочитать

«Руководство по настройке производительности базы данных Oracle»,

публикуемое корпорацией Oracle, в котором полностью описаны инструменты,

упомянутые в этом разделе, а также приведён обширный список

подсказок.

Пакет Diagnostic Pack в составе Oracle Enterprise Manager

Входящий в состав Oracle Enterprise Manager пакет Diagnostic Pack собирает

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