Понимание стоимости каждого шага в плане выполнения Oracle - PullRequest
0 голосов
/ 18 декабря 2018

Execution plan С помощью следующего плана выполнения (базы данных Oracle) кто-нибудь может объяснить мне, как рассчитываются затраты для каждого шага относительно другого?Мне не нужно знать, что означает стоимость, а каково соотношение затрат между шагами.

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

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

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете быстро подтвердить, что ваш репетитор неправ.

Выполнить план объяснения для некоторого утверждения и проверить стоимость в верхней строке (line = 0 равно 7)

EXPLAIN PLAN  SET STATEMENT_ID = 'jara1' into   plan_table  FOR
select * 
from ACCOUNTS a 
left outer join ACCOUNTS b 
on a.ACC = b.ACC;

---    
SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', 'jara1','ALL'));

Plan hash value: 1881186757

-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |          |     4 |    24 |     7  (15)| 00:00:01 |
|*  1 |  HASH JOIN OUTER   |          |     4 |    24 |     7  (15)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ACCOUNTS |     4 |    12 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| ACCOUNTS |     4 |    12 |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$9E43CB6E
   2 - SEL$9E43CB6E / A@SEL$2
   3 - SEL$9E43CB6E / B@SEL$1

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

   1 - access("A"."ACC"="B"."ACC"(+))

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=1) "A"."ACC"[CHARACTER,1], "B"."ACC"[CHARACTER,1]
   2 - "A"."ACC"[CHARACTER,1]
   3 - "B"."ACC"[CHARACTER,1]

Note
-----
   - dynamic sampling used for this statement (level=2)

Теперь запустите оператор и получите OPTIMIZER_COST из V$SQL

select 
  OPTIMIZER_COST,
  sql_text
from v$sql 
where sql_text like 'select%ACCOUNTS%';

OPTIMIZER_COST SQL_TEXT                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
-------------- ---------
            7 select *  from ACCOUNTS a  left outer join ACCOUNTS b  on a.ACC = b.ACC 

Таким образом, вы видите, что стоимость рассчитывается нарастающим итогом, а верхняя строка содержит общие затраты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...