首页 » ORACLE » 如何看待sql执行计划里的cost

如何看待sql执行计划里的cost

比如下面的执行计划

执行计划
----------------------------------------------------------
Plan hash value: 4202050538

-----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |   107 | 15515 |    88   (2)| 00:00:02 |
|   1 |  SORT ORDER BY               |                      |   107 | 15515 |    88   (2)| 00:00:02 |
|   2 |   TABLE ACCESS BY INDEX ROWID| ICME_NOPROJECT_SCORE |   107 | 15515 |    87   (0)| 00:00:02 |
|*  3 |    INDEX RANGE SCAN          | UK_NOPROJECT_SCORE   |   107 |       |     7   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------

那总的代价是88,还是88+88+87+7呢?毫无疑问看第一行就可以,是88

Cost=(Single block I/O cost+ Multiblock I/O cost+ CPU cost)/sreadtim
#SRds*sreadtim #MRds*mreadtim #CPUCycles/cpuspeed

#SRds: Number of single block reads
#MRds: Number of multiblock reads
#CPUCycles: Number of CPU Cycles
Sreadtim: Single block read time
Mreadtim: Multiblock read time
Cpuspeed: Millions instructions per second

cost是从里层向外层累计折叠的,最上层那个表示总代价。oracle会在自动生成的计划里,选择一个最小代价的来执行你的sql

cost 只是在CBO优化器再执行时选择不同执行计划成本的一个判断值,如果为RBO优化器在执行计划中都看不到这个值

cost 内部记算方法oracle也不会公开,oracle内部用来比较各个执行计划所耗费的代价的值,从而使优化器可以选择最好的执行计划。不同语句的cost值不具有可比性,只能对同一个语句的不同执行计划的cost值进行比较。

想更多了解cost,可以去itpub找一个版主所写的

CBO成本计算初探

打赏

对不起,这篇文章暂时关闭评论。