boolean indexing
使用以下执行计划(oracle数据库),有人可以解释一下相对于另一个步骤的每个步骤的成本如何计算吗?我不需要成本的含义,步骤之间的成本关系是什么。
我正在上一堂有关oracle数据库的课程,老师告诉我们,为了计算请求的成本,我们需要添加除第一行以外的每一行的成本(对于该计划,他告诉我们总费用为348)。
但是,如果将其像树一样进行计算就更有意义了,其中每个父节点的成本是其子节点的成本之和,以及是否需要父操作的成本。
答案 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
因此,您可以确定费用是累计计算的,最上面一行包含总费用