План выполнения SQL запроса Oracle

advertisement
| План выполнения SQL запроса Oracle » FoxBase!
1 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
FoxBase!
Блог Oracle разработчика
Домой
DeepFormsCompiler
Глоссарий Oracle
MSSpeller
mp2ora
Контакты
Ресурсы
Sitemap
« Проверка соединения с Интернет в Delphi
bitmap conversion to rowid »
Янв 31 2011
План выполнения SQL запроса Oracle
Категории:
Программирование Oracle
автор: ora-dev
В этой статье мы рассмотрим получение плана выполнения (Explain Plan) SQL запросов в Oracle. При написании и
настройке SQL запросов в приложениях очень часто требуется понять, каким образом выполняется запрос, какие
запрос использует индексы и использует ли их вообще, какие методы доступа применяет оптимизатор Oracle при
выполнении SQL запроса. Узнать это можно построив план выполнения SQL запроса. Проанализировав
полученный план выполнения можно убедиться, что SQL запрос будет выполняться оптимально, либо принять
меры по изменению текста SQL запроса, создании дополнительных индексов или выполнить иные действия по
настройке SQL запроса или базы данных.
Прежде всего в вашей базе данных должна быть создана специальная системная таблица PLAN_TABLE, которая
может быть создана в схеме вашего приложения или в любой другой схеме. При этом необходимо просто дать
привилегии на таблицу PLAN_TABLE тому пользователю, который будет анализировать планы выполнения SQL
запросов.
Скрипт для создания таблицы PLAN_TABLE обычно находится в каталоге
ORACLE_HOME\RDBMS\ADMIN\utlxplan.sql.
Для версии базы данных Oracle 11gR2 скрипт создания PLAN_TABLE будет следующим:
CREATE TABLE PLAN_TABLE (
statement_id
VARCHAR2(30),
plan_id
NUMBER,
04/24/2013 02:30 PM
| План выполнения SQL запроса Oracle » FoxBase!
2 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
TIMESTAMP
DATE,
remarks
VARCHAR2(4000),
operation
VARCHAR2(30),
options
VARCHAR2(255),
object_node
VARCHAR2(128),
object_owner
VARCHAR2(30),
object_name
VARCHAR2(30),
object_alias
VARCHAR2(65),
object_instance numeric,
object_type
VARCHAR2(30),
optimizer
VARCHAR2(255),
Если вы создали эту таблицу для схемы вашего приложения и будете анализировать SQL запросы от имени
владельца схемы, то дальнейших действий не требуется. Однако как правило это не совсем удобно. Проще создать
отдельного владельца для этой таблицы или создать эту таблицу для SYS и затем дать на PLAN_TABLE привилегии
SELECT,INSERT,UPDATE,DELETE тем пользователям, которые будут заниматься анализом SQL запросов.
После этих действий вы можете анализировать SQL запросы при помощи команды explain plan for.
Таблица PLAN_TABLE способна хранить информацию о плане выполнения SQL запросов для разных пользователей.
При очередном анализе при помощи explain plan for вся старая информация для текущей сессии пользователя
стирается и формируется новая.
Как правило такой анализ выполняется в sqlplus. Пример анализа SQL запроса:
EXPLAIN PLAN FOR
SELECT *
FROM USER_OBJECTS
WHERE OBJECT_TYPE='TABLE';
После выполнения анализа SQL запроса (sqlplus сообщит: explained) можно посмотреть результаты анализа плана
выполнения SQL запроса. Сделать это можно простым просмотром строк таблицы PLAN_TABLE, однако это очень
неудобно и малоинформативно. Существет множество инструментов от сторонних производителей для анализа
информации в PLAN_TABLE, эти инструменты встроены в такие известные продукты как SQL
Navigator, Toad, PL/SQL Developer и др., но суть в том, что они не всегда могут оказаться под рукой и нам
необходимо уметь просматривать результаты explain plan в sqlplus. Для этого существует системный PL/SQL пакет
Oracle dbms_xplan. Ниже приводится известный запрос для получения форматированного отчета результатов
explain plan при помощи dbms_xplan:
SELECT * FROM TABLE(dbms_xplan.display(NULL,NULL,'basic'));
В результате мы получим следующий отчет в sqlplus:
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------Plan hash value: 2519779297
-------------------------------------------------------| Id | Operation
| Name
|
-------------------------------------------------------| 0 | SELECT STATEMENT
|
|
| 1 | VIEW
| USER_OBJECTS |
| 2 | UNION-ALL
|
|
| 3 | TABLE ACCESS BY INDEX ROWID | SUM$
| 4 | INDEX UNIQUE SCAN
| I_SUM$_1 |
| 5 | TABLE ACCESS BY INDEX ROWID | OBJ$
|
|
PLAN_TABLE_OUTPUT
Результаты плана выполнения запроса представлены в древовидном виде, удобном для анализа. В нашем примере
мы видим довольно сложный план выполнения SQL запроса из USER_OBJECTS, что связано с тем, что USER_OBJECTS
это представление, основанное на нескольких системных таблицах Oracle. Но мы в этом плане видим список
методов доступа и операций, которые будет выполнять Oracle при выполнении этого SQL запроса, а также
используемые в запросе объекты и индексы. Подробный разбор структуры именно этого запроса выходит за рамки
статьи, но этот пример хорошо показывает, в каком виде формируется отчет о плане выполнения SQL запроса.
Ниже приведено описание методов доступа к данным таблиц и операций, которые отображаются в отчете плана
выполнения SQL запроса. Зная суть этих методов доступа и операций можно грамотно самостоятельно
анализировать собственные SQL запросы.
Методы доступа к данным таблиц Oracle
04/24/2013 02:30 PM
| План выполнения SQL запроса Oracle » FoxBase!
3 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
Full Table Scan (FTS).
Полное сканирование таблицы при поиске. Часто это указание на проблему отсутствующего индекса таблицы или
его не использования по каким либо причинам, например, не собрана статистика для оптимизатора Oracle или
собрана давно и не соответствует текущему распределению данных в таблице. Но не всегда Full Table Scan это
проблема! Например, для таблиц с небольшим количеством строк Full Table Scan может быть гораздо быстрее, чем
индексный поиск. Все зависит от данных таблицы.
Index lookup.
Поиск значения в таблице по существующему индексу. В результате такого поиска в индексе ищется уникальный
внутренний системный идентификатор записи таблицы ROWID, по которому в дальнейшем осуществляется
быстрый доступ к искомой строке. Существует несколько разновидностей индексного поиска, которые будут
рассмотрены ниже:
- index unique scan
- index range scan
- index full scan
- index fast full scan
- index skip scan
Index unique scan.
Метод поиска единственного значения через уникальный индекс. Всегда возвращается одно значение.
Index range scan.
Метод применяется для поиска множества значений при помощи индекса. Используется при поиске диапазонов
значений при помощи SQL операторов between, >, <, <>, >=, <=. Для неуникального индекса может выдавать
множество значений и для условия равенства, например COL_NAME=3.
Index Full Scan.
Метод выполняет полное сканирование индекса. Применяется в том случае, если все необходимые данные могут
быть считаны из индекса без обращения к данным таблицы. Возвращает считанные данные в отсортированном
виде. Однако может быть неэффективен, так как всегда применяет одиночное чтение блоков индекса для
обеспечения сортировки. Как правило решение об эффективности использования Index Full Scan принимает
оптимизатор на основе собранной ранее статистики. Может применяться только тогда, когда все столбцы,
участвующие в запросе, присутствуют в индексе и имеют ограничение NOT NULL.
Index Fast Full Scan.
Выполняется полное сканирование индекса методом быстрого множественного чтения блоков индекса в сегменте
данных. Такое быстрое чтение может выполняться сразу несколькими параллельными процессами. Применяется в
том случае, если все необходимые данные могут быть считаны из индекса без обращения к данным таблицы. Не
осуществляет сортировку считанных данных. Может применяться только тогда, когда все столбцы, участвующие в
запросе, присутствуют в индексе и имеют ограничение NOT NULL.
Index Skip Scan.
Метод доступа к составному индексу. Появился в Oracle начиная с девятой версии. В более ранних версиях Oracle не
использовал составной индекс, если в условиях запроса не был в обязательном порядке указан лидирующий
столбец составного индекса, что приводило к рекомендации использовать в составном индексе первым наиболее
часто используемый столбец в SQL запросах. Метод доступа Index Skip Scan снял эти ограничения, теперь
составной индекс может быть использован и в случае отсутствия в условиях запроса лидирующего столбца
составного индекса.
ROWID.
Самый быстрый метод доступа к данным таблицы по внутреннему системному идентификатору записи таблицы.
Обычно применяется после индексного поиска или при явном указании в SQL запросе значения ROWID строки
данных таблицы.
Joins.
04/24/2013 02:30 PM
| План выполнения SQL запроса Oracle » FoxBase!
4 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
Join или Соединение это предикат, который объединяет данные из нескольких источников данных (таблиц и
представлений). Существует 3 вида соединений, которые рассматриваются ниже:
- Sort Merge Join (SMJ)
- Nested Loops (NL)
- Hash Join (HJ)
Sort Merge Join (SMJ).
Выполняется соединение данных нескольких источников при помощи предварительной сортировки данных
исходных таблиц. Часто очень неэффективный алгоритм из-за потенциально больших накладных расходов на
сортировку данных перед выполнением соединения.
Nested Loops (NL).
Метод соединения данных вложенными циклами. Наиболее общий алгоритм соединения данных из нескольких
внешних источников. Сначала сканируется источник 1, затем для каждой найденной записи источника 1 в цикле
ищется удовлетворяющий условию список строк из источника 2, затем организуется цикл по источнику 3 и т. д. В
случае наличия индексов осуществляется индексный поиск данных в источниках по заданным условиям, иначе
выполняется полное сканирование таблиц-источников. В случае отсутствия индексов время выполнения
соединения может оказаться неприемлемо высоким.
Hash Join (HJ).
При выполнении соединения предварительно строится хэш-массив согласно условиям поиска. Hash Join является
самым быстрым алгоритмом соединения данных из нескольких источников, появился начиная с версии Oracle 7.3,
однако не является универсальным, т.е. не может быть использован для любых условий соединений.
Cartesian Product.
Декартово произведение. Декартово произведение возникает обычно в том случае, если для нескольких
источников не указаны никакие условия соединения. В итоге каждая строка из источника 1 соединяется со всеми
строками источника 2, затем то же самое для каждой строки источника 2 по отношению к источнику 3 и так далее.
Декартово произведение способно генерировать огромное количество строк и как правило является ошибкой
кодирования. Однако иногда декартово произведение может применяться намеренно.
Основные операции, которые показываются в Explain Plan
Sort.
Показываются операции сортировки данных, которые предполагается выполнить. Сортировка выполняется в
следующих случаях:
- order by
- group by
- sort merge join
В случаях, если сортировка выполнена в результате особенностей доступа к данным, то в плане выполнения
указывается, что сортировка не потребовалась. Например:
SORT GROUP BY NOSORT
INDEX FULL SCAN .....
Сортировки очень дорогие операции по используемым ресурсам. Если данные для сортировки не умещаются в
оперативной памяти буферного кэша, то они помещаются на диск.
Filter.
Показывает наложение фильтра на полученную выборку по некоторым условиям запроса.
View.
Показывает использование в SQL запросе представления Oracle.
www.foxbase.ru
04/24/2013 02:30 PM
| План выполнения SQL запроса Oracle » FoxBase!
5 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
Оставить комментарий
Почта (не публикуется) Обязательные поля помечены *
Имя: *
E-Mail: *
Сайт:
Сообщение: *
Оповещать о новых комментариях по почте
Введите то, что видите:
Добавить комментарий
Полезные ресурсы
Организация и проведение корпоративного нового года в Москве . Грамотная юридическая консультация по
земельным вопросам и жилищному праву. .
Поиск по сайту
Поиск
Поиск
Рубрики
Delphi
Delphi компоненты
GoldenGate
Java
Joomla
MapForce
Mercurial
Oracle ADF
Oracle Apex
Oracle CoreApp
Oracle Data Integrator
Oracle Forms
Oracle Mapviewer
Oracle Retail
Oracle Spatial
Oracle. Основные Концепции
Wordpress
Администрирование Oracle
Новости Oracle
Новости сайта
Обзоры
04/24/2013 02:30 PM
| План выполнения SQL запроса Oracle » FoxBase!
6 of 6
http://www.foxbase.ru/oracle-programming/plan-vypolneniy...
Полезные SQL запросы
Полезные функции
Программирование Oracle
Программирование на Java для начинающих
Последние комментарии
saitorob.if.ua на Livejournal XML-RPC. Часть 1
samsim на RemObjects PascalScript
ora-dev на Умора про хоккей
tenorio на Умора про хоккей
DJ_miXxXer на Indy TIdHTTP.POST и русские символы в параметрах запроса
samsim на Закрываем форму в Delphi по Escape
ora-dev на Livejournal XML-RPC. Часть 1
saitodel.rv.ua на Livejournal XML-RPC. Часть 1
ora-dev на Select случайной строки в Oracle
itsepainen на Select случайной строки в Oracle
ora-dev на Сообщения в процессах Oracle Apex
itsepainen на Сообщения в процессах Oracle Apex
ora-dev на Сообщения в процессах Oracle Apex
itsepainen на Сообщения в процессах Oracle Apex
ora-dev на Indy Cookie Manager своими руками
Управление
Регистрация
Вход
RSS Записей
RSS Комментариев
feedburner
Авторские права
© 2013 FoxBase!
Вернуться к началу
04/24/2013 02:30 PM
Download