СТАТЬЯ |
09.05.01
|
ГЛАВА 5
НАСТРОЙКА ПРЕДЛОЖЕНИЙ SQL
Настройка ваших предложений SQL - важная часть процесса достижения наилучшей возможной производительности ORACLE. Вы должны настроить ваши предложения SQL до того, как ваш администратор базы данных настроит сам ORACLE:
Эта глава рассказывает вам:
Эта глава предполагает, что вы знакомы с понятием плана исполнения, и знаете, как он генерируется оптимизатором ORACLE. Эта информация приведена в главе 13 "Оптимизатор" документа ORACLE7 Server Concepts Manual.
После того, как вы настроите ваши предложения SQL, администратор вашей базы данных может приступить к настройке ORACLE, как описывается в главе 20 "Понимание процесса настройки" документа ORACLE7 Server Administrator's Guide.
Как писать новые предложения SQL
Если вы пишете предложения SQL в новом приложении, выполните следующие шаги, чтобы оптимизировать эти предложения:
Все эти шаги обсуждаются в последующих секциях.
Эта секция дает рекомендации по созданию индексов и обсуждает следующие вопросы:
Приняв решение о создании индекса, вы можете выдать команду CREATE INDEX, чтобы создать этот индекс. Для дополнительной информации о создании индексов обратитесь к главе 2 этого руководства, "Управление объектами схемы".
Индексы улучшают производительность тех запросов, которые выбирают небольшой процент строк из таблицы. Как общее правило, вы должны создавать индексы
по таблицам, из которых часто выбирается 2-4% строк. Это правило основывается на следующих предположениях:
Если эти предположения не характеризуют данные в вашей таблице и запросы, выбирающие их, то процент выбираемых строк, при котором индекс полезен, может возрасти вплоть до 25%.
Как выбирать столбцы для индекса
При выборе столбцов для индекса руководствуйтесь следующими правилами:
Решая, индексировать ли данный столбец, учитывайте, компенсирует ли выигрыш в производительности, достигаемый для запросов, тех потерь производительности, которые будут иметь место для предложений INSERT, UPDATE и DELETE, а также той памяти, которая будет затрачена на индекс. Вы можете провести эксперименты и сравнить время обработки ваших предложений SQL с индексами и без них. Время обработки можно измерять с помощью средства трассировки SQL. Для информации о средстве трассировки SQL обратитесь к приложению B "Инструменты диагностики производительности" в этом руководстве.
Как выбирать составные индексы
СОСТАВНОЙ ИНДЕКС - это индекс, состоящий из более чем одного столбца. Составные индексы могут предоставлять дополнительные преимущества по сравнению с одностолбцовыми индексами:
Предложение SQL может использовать путь доступа, включающий составной индекс, если это предложение содержит конструкты, которые используют ведущую порцию индекса. ВЕДУЩАЯ ПОРЦИЯ индекса - это один или несколько столбцов, которые были специфицированы первыми и подряд в списке столбцов предложения CREATE INDEX, с помощью которого был создан индекс. Рассмотрим следующее предложение CREATE INDEX:
CREATE INDEX comp_ind
ON tab1(x, y, z)
Следующие комбинации столбцов являются ведущими порциями этого индекса: X, XY и XYZ. Другие комбинации столбцов, например, XZ, YZ или Z, не являются ведущими порциями этого индекса.
При выборе столбцов для составных индексов руководствуйтесь следующими правилами:
Разумеется, необходимо учитывать и вопросы, касающиеся общих преимуществ и недостатков индексов, которые рассматривались в предыдущих секциях.
Как писать предложения, использующие индексы
После того, как вы создали индекс, оптимизатор не сможет использовать путь доступа через этот индекс просто потому, что он существует. Оптимизатор может выбрать такой путь доступа для предложения SQL лишь тогда, когда это предложение содержит конструкт, делающий этот путь возможным. Для информации о путях доступа и конструктах, делающих их возможными, обратитесь к главе 13 "Оптимизатор" документа ORACLE7 Server Concepts Manual.
Чтобы гарантировать, что предложение SQL может использовать путь доступа через индекс, обеспечьте, чтобы это предложение содержало конструкт, делающий этот путь возможным. Если вы используете стоимостной подход, вы должны также сгенерировать статистики для индекса. После того, как вы сделаете путь доступа через индекс возможным для предложения, оптимизатор сможет выбрать или не выбрать его, в зависимости от других возможных путей доступа.
Как писать предложения, избегающие использования индексов
В некоторых случаях вы можете захотеть предотвратить возможность использования пути доступа через существующий индекс. Например, вы можете знать,
что индекс очень селективен для вашего случая, и что полный просмотр таблицы был бы более эффективен. Если предложение содержит конструкт, который делает
возможным путь доступа через индекс, вы можете заставить оптимизатор использовать полный просмотр таблицы с помощью одного из следующих методов:
Так как поведение оптимизатора может измениться в будущих версиях ORACLE, полагаться на первый метод для выбора пути доступа в долгосрочном плане не следует. Вместо этого используйте советы, чтобы предлагать оптимизатору конкретные пути доступа. Для информации о советах обратитесь к секции "Как использовать советы"
Пример
Рассмотрим следующие запросы, которые выбирают строки из таблицы, базируясь на значении единственного столбца:
SELECT *
FROM tab1
WHERE col1 = 'A'
SELECT *
FROM tab1
WHERE col1 = 'B'
Предположим, что значениями столбца COL1 являются буквы от A до Z. Предположим также, что таблица имеет 1000 строк, и что 75% этих строк имеют значение столбца COL1, равное 'A'. Каждая из остальных букв появляется в 1% строк.
Так как значение 'A' появляется в 75% строк таблицы, первый запрос, вероятно, был бы выполнен быстрее путем полного просмотра таблицы, чем через просмотр индекса по столбцу COL1. Так как значение 'B' появляется в 1% строк, для второго запроса эффективнее был бы просмотр индекса по столбцу COL1. Следовательно, желательно создать индекс для второго запроса, но нежелательно, чтобы этот индекс использовался в первом запросе. Однако количество экземпляров каждого конкретного значения столбца COL1 неизвестно оптимизатору. Оптимизатор выберет один и тот же путь доступа для обоих запросов, несмотря на существенную разницу в процентах строк, возвращаемых каждым запросом.
Чтобы добиться лучшей производительности для обоих запросов, создайте индекс по столбцу TAB1.COL1, чтобы он мог использоваться вторым запросом:
CREATE INDEX col1_ind
ON tab1(col1)
Модифицируйте фразу WHERE первого запроса так, чтобы она сделала невозможным путь доступа через индекс COL1_IND:
SELECT *
FROM tab1
WHERE col1 || '' = 'A'
Это изменение предотвращает использование для этого запроса пути доступа через индекс COL1_IND. Индексные пути доступа невозможны, если фраза WHERE выполняет операцию или функцию на индексированном столбце. Поэтому оптимизатор будет вынужден выбрать полный просмотр таблицы для этого запроса.
Заметьте, что это изменение фразы WHERE не изменяет результат условия, так что множество строк, возвращаемых запросом, остается тем же самым. Для столбца, содержащего числовые данные или дату, вы можете достичь той же цели, изменив фразу WHERE так, чтобы значение столбца прибавлялось к 0.
предыдущая часть | содержание | следующая часть
Дополнительную информацию Вы можете получить в компании Interface Ltd.
Обсудить на форуме Oracle
Отправить ссылку
на страницу по e-mail
Interface Ltd. Отправить E-Mail http://www.interface.ru |
|
Ваши замечания и предложения отправляйте
автору По техническим вопросам обращайтесь к вебмастеру Документ опубликован: 09.05.01 |