Различия в результатах EXPLAIN PLAN для SELECT и INSERT ... SELECT

Всё по теме СУБД Oracle: установка, настройка, использование, решение проблем и т.д. и т.п. и др. и пр.
Ответить
AntonS
Сообщения: 131
Зарегистрирован: Пт июн 03, 2022 8:51 am

Различия в результатах EXPLAIN PLAN для SELECT и INSERT ... SELECT

Сообщение AntonS »

Пользователь получил ошибку ORA-01031: insufficient privilege при построении плана EXPLAIN PLAN, но EXPLAIN PLAN это функция и у пользователя есть права SELECT ANY TABLE в базе данных.

Для SELECT план построился:

Код: Выделить всё

SQL> EXPLAIN PLAN FOR
SELECT * FROM hr.employees WHERE employee_id = 107;

SQL> select plan_table_output from table(dbms_xplan.display('plan_table',null,'typical'));
Plan hash value: 1833546154

---------------------------------------------------------------------------------------------
| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |               |     1 |    72 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |    72 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("EMPLOYEE_ID"=107)
При ближайшем рассмотрении, выяснилось, что пытались построить план на INSERT ... SELECT

Из документации EXPLAIN PLAN, требуются права на выполнение SQL-запроса, для которого определяется план выполнения при EXPLAIN PLAN.

Действительно, если выдать права на вставку в таблицу:

GRANT INSERT ON table TO user

То функция EXPLAIN PLAN начинает выдавать план выполнения без ошибок:

Код: Выделить всё

SQL> EXPLAIN PLAN FOR
INSERT INTO hr.employees_new (EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID) SELECT EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID FROM hr.employees WHERE employee_id = 107;

SQL> select plan_table_output from table(dbms_xplan.display('plan_table',null,'typical'));
Plan hash value: 1833546154

----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT             |               |     1 |    72 |     1   (0)| 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL     | EMPLOYEES_NEW |       |       |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |    72 |     1   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("EMPLOYEE_ID"=107)
Есть ли различия в построении плана EXPLAIN PLAN для SELECT и INSERT ... SELECT? Если у пользователя нет прав на вставку и он заменит INSERT ... SELECT в запросе на SELECT, то есть ли разница или построенные EXPLAIN PLAN планы всегда будут эквивалентны, как в примерах выше?
Аватара пользователя
Valery Yourinsky
Сообщения: 115
Зарегистрирован: Ср май 18, 2022 2:30 pm

Re: Различия в результатах EXPLAIN PLAN для SELECT и INSERT ... SELECT

Сообщение Valery Yourinsky »

Предполагаю, что планы выполнения SELECT в INSERT ... SELECT и просто SELECT могут отличаться.

Но скорее всего, это будет встречаться достаточно редко.
AntonS
Сообщения: 131
Зарегистрирован: Пт июн 03, 2022 8:51 am

Re: Различия в результатах EXPLAIN PLAN для SELECT и INSERT ... SELECT

Сообщение AntonS »

Интересно, в каких случаях выводы функции EXPLAIN PLAN могут отличаться и что влияет на это?

Ведь если полагаться на то, что планы выполнения для INSERT ... SELECT и простого SELECT не отличаются, то это удобно, т.к. можно не выдавать пользоватлям права на INSERT. Аналогичное предположение можно сделать и для команды MERGE INTO
Ответить