| План выполнения 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