Oracle Live SQL: Explain Plan

Tags: Oracle, SQL

Мы все сталкивались с ситуацией, когда нужно было проверить простой запрос или синтаксис для своего SQL, не имея базы данных. Конечно, у большинства из нас есть по крайней мере виртуальная машина для этого, но для ее запуска требуется время, и если вы работаете с аккумулятора, это может оставить вас без питания довольно быстро. Некоторое время назад Oracle начала предлагать новый сервис под названием «Oracle Live SQL». Он предоставляет вам возможность тестировать SQL-запрос, процедуру или функцию и иметь библиотеку кодов, содержащую множество примеров и скриптов. Кроме того, вы можете сохранить свои собственные скрипты для повторного их выполнения позже. Это действительно отличный онлайн-инструмент, но ему не хватает некоторых функций. Мы попытался проверить план выполнения для моего запроса, но, к сожалению, он не работал:

explain plan for

select * from test_tab_1 where pk_id<10;

ORA-02402: PLAN_TABLE not found

Итак, что мы можем сделать, чтобы заставить его работать? Обходной путь не идеален, но он работает и может быть использован в некоторых случаях. Нам нужно создать собственную таблицу плана, используя скрипт из установленной базы данных $ORACLE_HOME/rdbms/admin/utlxplan.sql. Мы можем открыть файл и скопировать инструкцию для создания таблицы плана на рабочий лист SQL в Live SQL. И вы можете сохранить сценарий в библиотеке кодов Live SQL и сделать его закрытым, чтобы повторно использовать его позже, потому что вам нужно будет воссоздавать таблицу каждый раз при повторном входе в вашу среду. Все идет нормально. Этого достаточно? Давайте проверим.

explain plan for

select * from test_tab_1 where pk_id<10;

Statement processed.

select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

ERROR: an uncaught error in function display has happened; please contact Oracle support

      Please provide also a DMP file of the used plan table PLAN_TABLE

      ORA-00904: DBMS_XPLAN_TYPE_TABLE: invalid identifier

Итак, пакет не работает. Мы попытались создать типы в нашей схеме, но это не сработало. Пока dbms_xplan не будет работать для нас, и мы должны запросить информацию непосредственно из нашей таблицы плана. Возможно, это не так удобно, но это дает нам достаточно и, не забывайте, вы можете сохранить свой скрипт и просто повторно использовать его позже. Вам не нужно запоминать запросы. Вот простой пример того, как получить информацию о вашем последнем выполненном запросе из таблицы плана:

SELECT parent_id,id, operation,plan_id,operation,options,object_name,object_type,cardinality,cost from plan_table where plan_id in (select max(plan_id) from plan_table) order by 2;

PARENT_ID   ID OPERATION   PLAN_ID OPERATION   OPTIONS OBJECT_NAME OBJECT_TYPE CARDINALITY COST

-  0 SELECT STATEMENT 268 SELECT STATEMENT -   - -  9 49

0   1 TABLE ACCESS 268 TABLE ACCESS FULL TEST_TAB_1  TABLE 9 49

[/lang]

I tried a hierarchical query but didn't find it too useful in the Live SQL environment. Also you may want to put unique identifier for your query to more easily find it in the plan_table.

explain plan set statement_id='123qwerty' into plan_table for

select * from test_tab_1 where pk_id<10;

SELECT parent_id,id, operation,plan_id,operation,options,object_name,object_type,cardinality,cost from plan_table where statement_id='123qwerty' order by id;

PARENT_ID   ID OPERATION   PLAN_ID OPERATION   OPTIONS OBJECT_NAME OBJECT_TYPE CARDINALITY COST

-  0 SELECT STATEMENT 272 SELECT STATEMENT -   - -  9 3

0   1 TABLE ACCESS 272 TABLE ACCESS BY INDEX ROWID BATCHED  TEST_TAB_1 TABLE 9 3

1   2 INDEX   272 INDEX RANGE SCAN  TEST_TAB_1_PK INDEX 9   2

Теперь у нас есть сценарий plan_table и запрос, сохраненный в Live SQL, и можно повторно использовать их, когда мы захотим проверить план моего запроса. Мы отправили фидбэк о возможности использования dbms_xplan, и представитель Oracle ответил быстро и заверил, что они уже работают с внедрением функции dbms_xplan и многими другими, включая возможность запуска только выбранного оператора SQL на листе SQL (например, мы делаем это в SQLdeveloper). Это звучит очень хорошо и многообещающе, и он сделает услугу еще лучше. Оставайтесь в курсе.

No Comments

Add a Comment