СТАТЬЯ
22.08.01

предыдущая часть | содержание | следующая часть

AND_EQUAL

Совет AND_EQUAL явно выбирает план исполнения, который использует путь доступа, осуществляющий слияние результатов просмотра по нескольким одностолбцовым индексам. Синтаксис этого совета имеет следующий вид:

где:

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

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

Советы для порядка соединения

Порядок соединения предлагается советом ORDERED.

ORDERED

Совет ORDERED заставляет ORACLE соединить таблицы в том порядке, в каком они появляются в фразе FROM. Например, следующее предложение соединяет таблицу TAB1 с таблицей TAB2, а затем соединяет результат с таблицей TAB3:

SELECT /*+ ORDERED */ tab1.col1, tab2.col2, tab3.col3
     FROM tab1, tab2, tab3
    WHERE tab1.col1 = tab2.col1
      AND tab2.col1 = tab3.col1

Если вы опустите совет ORDERED из предложения SQL, выполняющего соединение, то оптимизатор сам выбирает порядок, в котором будут соединяться таблицы.

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

Советы для операций соединения

Каждый совет, описанный в этой секции, предлагает операцию соединения для таблицы. Вы должны специфицировать в совете имя таблицы точно так же, как оно появляется в предложении. Если предложение использует алиас для таблицы, то вы должны указывать в совете алиас вместо имени таблицы. Имя или алиас должно представлять таблицу или синоним таблицы в вашей локальной базе данных.

USE_NL

Совет USE_NL заставляет ORACLE соединить каждую из указанных таблиц с другим источником строк путем операции соединения через вложенные циклы, используя указанную таблицу как внутреннюю таблицу. Синтаксис этого совета имеет следующий вид:

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

Например, рассмотрим следующее предложение, которое соединяет таблицы ACCOUNTS и CUSTOMERS, в предположении, что эти таблицы не находятся в (общем) кластере:

SELECT accounts.balance, customer.last_name, customer.first_name
    FROM accounts, customers
    WHERE accounts.custno = customers.custno

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

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

SELECT accounts.balance, customer.last_name, customer.first_name
    FROM accounts, customers
    WHERE accounts.custno = customers.custno

Во многих случаях соединение через вложенные циклы возвращает первую строку быстрее, чем соединение через сортировку-слияние. Соединение через вложенные циклы возвращает первую строку после того, как выберет первую строку из одной таблицы и соединит с ней первую совпадающую строку из другой таблицы, в то время как соединение через сортировку-слияние возвращает первую строку после того, как прочитает и отсортирует все выбираемые строки из обеих таблиц, а потом скомбинирует первые строки из обоих отсортированных источников строк.

USE_MERGE

Совет USE_MERGE заставляет ORACLE соединить каждую из указанных таблиц с другим источником строк путем операции соединения через сортировку-слияние. Синтаксис этого совета имеет следующий вид:

где "таблица" – имя или алиас таблицы, которая должна быть соединена с другим источником строк (являющимся результатом соединения предыдущих таблиц в порядке соединения) через операцию сортировки-слияния.

Рассмотрение альтернативных синтаксисов

Благодаря гибкости языка SQL, потребности вашего приложения можно выразить различными предложениями SQL. Хотя два разных предложения SQL могут возвращать один и тот же результат, ORACLE может обрабатывать одно из них быстрее, чем другое. Вы можете воспользоваться результатами команды EXPLAIN PLAN, чтобы сравнить планы исполнения и стоимости этих двух предложений и определить, какое из них эффективнее.

Следующий пример показывает планы исполнения для двух предложений SQL, выполняющих одну и ту же задачу. Оба эти предложения возвращают все отделы из таблицы DEPT, для которых нет ни одного сотрудника в таблице EMP. Каждое предложение осуществляет поиск по таблице EMP с помощью подзапроса. Предположим, что по столбцу DEPTNO таблицы EMP существует индекс с именем DEPTNO_INDEX.

Первое предложение и его план исполнения имеют следующий вид:

SELECT dname, deptno
     FROM dept
    WHERE deptno NOT IN
            (SELECT deptno FROM emp)

Шаг 3 вывода команды EXPLAIN PLAN для этого запроса показывает, что ORACLE исполняет это предложение путем полного просмотра таблицы EMP, несмотря на существование индекса по столбцу DEPTNO. Этот полный просмотр может быть довольно продолжительной операцией. ORACLE не использует индекс потому, что подзапрос, осуществляющий поиск по таблице EMP, не содержит фразы WHERE, которая сделала бы возможным индексный путь доступа.

Однако следующее предложение SQL выбирает те же самые строки, обращаясь к индексу:

SELECT dname, deptno
     FROM dept
    WHERE NOT EXISTS
            (SELECT deptno
                    FROM emp
                    WHERE dept.deptno = emp.deptno)

Фраза WHERE подзапроса ссылается на столбец DEPTNO таблицы EMP, что позволяет использовать индекс DEPTNO_INDEX. Использование индекса отражено в шаге 3 плана исполнения. Интервальный просмотр по индексу DEPTNO_INDEX требует меньше времени, чем полный просмотр таблицы EMP в первом предложении. Более того, первый запрос выполняет один полный просмотр таблицы EMP для каждого значения DEPTNO в таблице DEPT. По этим причинам, второе предложение SQL быстрее, чем первое.

Если в ваших приложениях есть предложения, использующие оператор NOT IN, как в первом запросе этого примера, вы должны рассмотреть возможность исправления этих предложений так, чтобы они использовали оператор NOT EXISTS. Это позволило бы таким предложениям использовать индекс, когда он существует.

Как настраивать существующие предложения SQL

Настройка предложений SQL в существующем приложении несколько, хотя и не в полной мере, отличается от написания новых предложений. Хотя знания, требуемые в обоих случаях, те же самые, процесс может быть иным. Вы должны изолировать конкретные предложения в вашем приложении, которые нуждаются в настройке. Для этого следует:

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

Знакомство с приложением

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

Обсудите производительность приложения с его пользователями. Попросите их указать те части приложения, где, по их мнению, следовало бы улучшить производительность. Сужайте эти части до тех пор, пока не дойдете до индивидуальных предложений SQL, если возможно.

Использование средства трассировки SQL

ORACLE предоставляет несколько диагностических инструментов для измерения производительности. Одним из этих инструментов, наиболее полезным в настройке приложений, является средство трассировки SQL. Средство трассировки SQL генерирует статистики для каждого предложения SQL, обрабатываемого ORACLE. Эти статистики отражают:

Средство трассировки SQL может также генерировать планы исполнения, используя команду EXPLAIN PLAN.

Запустите ваше приложение с включенным средством трассировки SQL. По результирующим статистикам определите, какие предложения SQL требуют наибольшего времени на обработку. Сконцентрируйте ваши усилия по настройке на этих предложениях.

Для дополнительной информации о том, как вызывать средство трассировки SQL и другие инструменты диагностики производительности, и как анализировать их вывод, обратитесь к приложению B этого руководства, "Инструменты диагностики производительности".

Настройка индивидуальных предложений SQL

Помните, что вы можете испытывать альтернативные синтаксисы для предложений SQL, не подвергая модификации ваше приложение. Просто выдайте команду EXPLAIN PLAN с альтернативным предложением, которое вы рассматриваете, и сравните его план исполнения и стоимость с характеристиками существующего предложения. Вы можете найти стоимость предложения SQL в столбце POSITION первой строки вывода, генерируемого командой EXPLAIN PLAN. Однако вы должны запустить приложение, чтобы определить, какое из предложений может быть действительно исполнено быстрее.

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

Не забывайте также, что средства, которые вы применяете для настройки одного предложения, могут повлиять на выбор оптимизатором планов исполнения для других предложений. Например, если вы создаете индекс для использования одним предложением, оптимизатор может выбирать этот индекс и для других предложений в вашем приложении. Поэтому после настройки предложений, которые вы идентифицировали первоначально, вы должны заново исследовать производительность вашего приложения с помощью средства трассировки SQL.

предыдущая часть | содержание | следующая часть

Дополнительную информацию Вы можете получить в компании Interface Ltd.

Обсудить на форуме Oracle
Отправить ссылку на страницу по e-mail


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 22.08.01