Как я могу увидеть план выполнения SQL в Oracle?

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

  • Я хотел бы посмотреть, использует ли конкретный запрос индекс.
  • На самом деле я хочу увидеть разницу между выполнением запроса с использованием индекса и без использования индекса (поэтому я хочу увидеть план выполнения для моего запроса).

Я использую sql+.

Как мне увидеть план выполнения и где я могу найти в нем информацию о том, использовался ли мой индекс или нет?

Ответ 1

Попробуйте использовать этот код, чтобы сначала объяснить, а затем просмотреть план:

Объясните план:

explain plan 
for 
select * from table_name where ...;

См. план:

select * from table(dbms_xplan.display);

Изменить: удалены скобки

Ответ 3

Попробуйте следующее:

http://www.dba-oracle.com/t_explain_plan.htm

В плане выполнения указывается индекс, когда он используется. Просто прочитайте план выполнения.

Ответ 4

SQL> explain plan for 2 
     select * from hr.employees;

Разъяснения.

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

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1445457117

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------------

8 rows selected.

ИЛИ

SQL> set autotrace traceonly explain
SQL> select * from hr.employees;

Execution Plan
----------------------------------------------------------
Plan hash value: 1445457117

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 107 | 7704 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| EMPLOYEES | 107 | 7704 | 3 (0)| 00:00:01 |

https://wordpress.com/post/cevikfaruk.wordpress.com/277

Ответ 5

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

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

enter image description here

Фактический план выполнения 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'