Существует оператор в процессе удаления оператора? - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу знать порядок процесса, который сначала выполняется ..
Сначала я создаю таблицу =>

SQL> create table ramin.tab001 ( id number, name varchar2(20));
Table created.
    SQL> select *from ramin.tab001;

        ID NAME
---------- --------------------
         1 kamran
         2 emin
         3 ramin
         4 john

После этого я использую коррелированный подзапрос с автотрассировкой по опции =>

SQL>delete from ramin.tab001 a where exists( select * from ramin.tab001 where id = a.id );

План выполнения =>

Execution Plan
----------------------------------------------------------
Plan hash value: 906765530

------------------------------------------------------------------------------
| Id  | Operation           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | DELETE STATEMENT    |        |     6 |    36 |     6   (0)| 00:00:01 |
|   1 |  DELETE             | TAB001 |       |       |            |          |
|*  2 |   HASH JOIN SEMI    |        |     6 |    36 |     6   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| TAB001 |     6 |    18 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TAB001 |     6 |    18 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------

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

   2 - access("ID"="A"."ID")


Statistics
----------------------------------------------------------
          0  recursive calls
          7  db block gets
          6  consistent gets
          0  physical reads
       1204  redo size
        848  bytes sent via SQL*Net to client
       1005  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          4  rows processed

Я знаю, что в коррелированном порядке подзапроса процесс = = *
1. выполнить внутренний запрос
2. выполнить внешний запрос исравнивается с результатом внутреннего запроса
Так что мне нужно мнение экспертов о порядке процесса в утверждении или о том, как я могу проверить из автотрассировки?

1 Ответ

0 голосов
/ 06 ноября 2019

Как прочитать план выполнения?

Ответ прост. Читайте его так же, как если бы вы читали многоуровневый вызов функций на императивном языке.

Например, , ваш план выполнения

------------------------------------------------------------------------------
| Id  | Operation           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | DELETE STATEMENT    |        |     6 |    36 |     6   (0)| 00:00:01 |
|   1 |  DELETE             | TAB001 |       |       |            |          |
|*  2 |   HASH JOIN SEMI    |        |     6 |    36 |     6   (0)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| TAB001 |     6 |    18 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TAB001 |     6 |    18 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------

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

   2 - access("ID"="A"."ID")

можно прочитать (вформа императивного псевдокода) просто как

delete(
    from: "TAB001",
    data_set_to_be_deleted: semi_join(
        join_algorithm: "hash join",
        leading_data_set: table_access(
            read_access_method: "full",
            table_name: "TAB001"
        ),
        trailing_data_set: table_access(
            read_access_method: "full",
            table_name: "TAB001",
            aliased_as: "A"
        ),
        join_condition: "ID = A.ID"
    )
)
...