了解Oracle执行计划中每个步骤的成本

时间:2018-12-18 14:11:22

标签: oracle

boolean indexing 使用以下执行计划(oracle数据库),有人可以解释一下相对于另一个步骤的每个步骤的成本如何计算吗?我不需要成本的含义,步骤之间的成本关系是什么。

我正在上一堂有关oracle数据库的课程,老师告诉我们,为了计算请求的成本,我们需要添加除第一行以外的每一行的成本(对于该计划,他告诉我们总费用为348)。

但是,如果将其像树一样进行计算就更有意义了,其中每个父节点的成本是其子节点的成本之和,以及是否需要父操作的成本。

1 个答案:

答案 0 :(得分:5)

您可以快速确认您的导师是错误的。

执行一些陈述的解释计划,并检查第一行的费用(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 

因此,您可以确定费用是累计计算的,最上面一行包含总费用