Как вы получаете план объяснения?


10

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


1
«если есть какой-либо сценарий SQL, который можно использовать в качестве утилиты для этого», какой тип утилиты вы ищете?
Дерек Дауни

2
Многие инструменты разработки SQL имеют очень простые в использовании графические интерфейсы для получения планов выполнения. Oracle SQL Developer имеет один. У вас есть доступ к любым таким инструментам, или вы специально хотите сделать это из скриптов?
FrustratedWithFormsDesigner

У меня есть Oracle SQL Developer, но я хотел бы знать скрипты.
user419534

2
Если вы пошли на курс с Джонатаном Льюисом , то вы будете знать, что есть около 8 различных способов получить план выполнения из Oracle. Пожалуйста, добавьте комментарий, если вы хотите, чтобы я добавил ответ, перечисляющий все различные методы.
Colin 't Hart

Ответы:


9

Вы можете использовать пакет DBMS_XPLAN :

SQL> explain plan for select * from dual;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             |     1 |     2 |     2 |
|   1 |  TABLE ACCESS FULL   | DUAL        |     1 |     2 |     2 |
--------------------------------------------------------------------
Note: cpu costing is off

5

Оператор EXPLAIN PLAN отображает планы выполнения, выбранные оптимизатором для операторов SELECT, UPDATE, INSERT и DELETE. План выполнения оператора - это последовательность операций, которую база данных выполняет для выполнения оператора.

EXPLAIN PLAN FOR ...

Замените ... вашим оператором SQL. После запуска выполните следующую команду для просмотра плана:

SELECT * FROM table(dbms_xplan.display);

Для получения дополнительной информации см. Разделы « Обзор» или « Использование» в Руководстве по настройке производительности Oracle 11g.


1

Это очень распространенный вопрос, поэтому я решил превратить этот ответ в статью .

Примерный план выполнения SQL

Предполагаемый план выполнения создается оптимизатором без выполнения запроса SQL. Вы можете сгенерировать примерный план выполнения из любого клиента SQL, используя EXPLAIN PLAN FOR, или вы можете использовать Oracle SQL Developer для этой задачи.

ОБЪЯСНИТЕ ПЛАН ДЛЯ

При использовании Oracle, если вы добавите EXPLAIN PLAN FORкоманду к заданному SQL-запросу, база данных сохранит примерный план выполнения в связанном PLAN_TABLE:

EXPLAIN PLAN FOR
SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Чтобы просмотреть примерный план выполнения, вам нужно использовать DBMS_XPLAN.DISPLAY, как показано в следующем примере:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'))

Параметр форматирования ALL + OUTLINE позволяет получить более подробную информацию о предполагаемом плане выполнения, чем при использовании параметра форматирования по умолчанию.

Oracle SQL Developer

Если вы установили SQL Developer, вы можете легко получить примерный план выполнения для любого SQL-запроса без необходимости добавлять команду EXPLAIN PLAN FOR:

введите описание изображения здесь

Фактический план выполнения SQL

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

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

Подсказка запроса GATHER_PLAN_STATISTICS

Чтобы указать Oracle хранить фактический план выполнения для данного запроса SQL, вы можете использовать GATHER_PLAN_STATISTICSподсказку запроса:

SELECT /*+ GATHER_PLAN_STATISTICS */
  p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

Чтобы визуализировать фактический план выполнения, вы можете использовать DBMS_XPLAN.DISPLAY_CURSOR:

SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'ALLSTATS LAST ALL +OUTLINE'))

Включить STATISTICS на уровне соединения с БД

Если вы хотите получить планы выполнения для всех запросов, сгенерированных в данном сеансе, вы можете установить STATISTICS_LEVELконфигурацию сеанса на ВСЕ:

ALTER SESSION SET STATISTICS_LEVEL='ALL'

Это будет иметь тот же эффект, что и GATHER_PLAN_STATISTICSуказание подсказки для каждого запроса на выполнение. Таким образом, так же, как с GATHER_PLAN_STATISTICSподсказкой запроса, вы можете использовать DBMS_XPLAN.DISPLAY_CURSORдля просмотра фактического плана выполнения.

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

ALTER SESSION SET STATISTICS_LEVEL='TYPICAL'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.