关于执行计划中的%CPU的含义

简介: 今天突然想起前段时间学习的一篇博客,是oaktable的Charles Hooper所写,链接为: https://hoopercharles.wordpress.com/2010/02/19/what-is-the-meaning-of-the-cpu-column-in-an-explain-plan/ 自己也趁机消化了一下。
今天突然想起前段时间学习的一篇博客,是oaktable的Charles Hooper所写,链接为:
https://hoopercharles.wordpress.com/2010/02/19/what-is-the-meaning-of-the-cpu-column-in-an-explain-plan/
自己也趁机消化了一下。对于执行计划中的 列Cost (%CPU),其中的%CPU的含义很少有人能够说得清楚,于是Charles Hooper写了上面的文章来解释。
对于执行计划的信息都会放入plan_table,所以对于plan_table中存在的三个列,也是需要格外关心的。
我也顺便从官方文档中查看了cost,cpu_cost,io_cost在10g,11g中的解释,发现还是有很大的差别,10g版本中只是寥寥几笔带过,11g中的问当描述就要详细的多。

11g 10g
COST Cost of the operation as estimated by the optimizer's query approach. Cost is not determined for table access operations. The value of this column does not have any particular unit of measurement; it is merely a weighted value used to compare costs of execution plans. The value of this column is a function of the CPU_COST and IO_COST columns. Cost of the current operation estimated by the cost-based optimizer (CBO)
CPU_COST CPU cost of the operation as estimated by the query optimizer's approach. The value of this column is proportional to the number of machine cycles required for the operation. For statements that use the rule-based approach, this column is NULL User-defined CPU cost
IO_COST I/O cost of the operation as estimated by the query optimizer's approach. The value of this column is proportional to the number of data blocks read by the operation. For statements that use the rule-based approach, this column is NULL. User-defined CPU cost
对于%CPU的计算方式,还是根据CBO模型估算的值,我就不按照这位大师的方式了。自己准备了一些数据也来简单模拟一下。
首先创建两个表,一个大表,一个小表。
create table test_big as select object_id,object_name from all_objects;
create table test_small as select object_id,object_name from all_objects where rownum<10;
收集统计信息
exec dbms_stats.gather_table_stats(OWNNAME=>null,tabname=>'TEST_BIG',cascade=>TRUE);
exec dbms_stats.gather_table_stats(OWNNAME=>null,tabname=>'TEST_SMALL',cascade=>TRUE);
然后开始得到执行计划的信息
explain plan for select big.object_id from test_big big,test_small small where big.object_id=small.object_id order by big.object_id;
查看执行计划信息如下:
SQL> select *from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
Plan hash value: 714063251
----------------------------------------------------------------------------------
| Id  | Operation           | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |            |     9 |    72 |   104   ( 2)| 00:00:02 |
|   1 |  SORT ORDER BY      |            |     9 |    72 |   104   (2)| 00:00:02 |
|*  2 |   HASH JOIN         |            |     9 |    72 |   103   ( 1)| 00:00:02 |
|   3 |    TABLE ACCESS FULL| TEST_SMALL |     9 |    27 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TEST_BIG   | 72872 |   355K|    99   (0)| 00:00:02 |
----------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("BIG"."OBJECT_ID"="SMALL"."OBJECT_ID")
16 rows selected.
这个时候可以看到在有些行中显示%CPU为1,有些为2.
我们来看看plan_table中的结果。
SELECT
  ID,
  COST,
  IO_COST,
  CPU_COST
FROM
  PLAN_TABLE;
结果如下:
        ID       COST    IO_COST   CPU_COST
---------- ---------- ---------- ----------
         0        104        102   69336070
         1        104        102   69336070
         2        103        102   36982117
         3          3          3      29836
         4         99         99   13487397
至于%CPU的计算方式,可以参考下面的例子。
SELECT
  ID,
  COST,
  IO_COST,
  COST-IO_COST DIFF,
  CEIL(DECODE(COST,0,0,(COST-IO_COST)/COST)*100) PER_CPU,
  CPU_COST
FROM
  PLAN_TABLE;
        ID       COST    IO_COST       DIFF    PER_CPU   CPU_COST
---------- ---------- ---------- ---------- ---------- ----------
         0        104        102          2          2   69336070
         1        104        102          2          2   69336070
         2        103        102          1          1   36982117
         3          3          3          0          0      29836
         4         99         99          0          0   13487397
可以看到在id=0的行 %CPU为2,id=2的行,%CPU为1
这些也是完全和执行计划吻合的。
再来看一个例子,我们开启一个并行查询。
SQL> explain plan for select /*+parallel*/ *from test_big ;
Explained.
这个时候直接查看plan_table的结果,来猜猜执行计划的情况。
SQL> SELECT
      ID,
      COST,
      IO_COST,
      COST-IO_COST DIFF,
      CEIL(DECODE(COST,0,0,(COST-IO_COST)/COST)*100) PER_CPU,
      CPU_COST
    FROM
      PLAN_TABLE;
        ID       COST    IO_COST       DIFF    PER_CPU   CPU_COST
---------- ---------- ---------- ---------- ---------- ----------
         0         55         55          0          0    6882356
         1
         2         55         55          0          0    6882356
         3         55         55          0          0    6882356
         4         55         55          0          0    6882356
再次查看执行计划的情况。
SQL> select *from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------------------
Plan hash value: 2497108266
--------------------------------------------------------------------------------------------------------------
| Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT     |          | 72872 |  2063K|    55   ( 0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR      |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)| :TQ10000 | 72872 |  2063K|    55   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    PX BLOCK ITERATOR |          | 72872 |  2063K|    55   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   4 |     TABLE ACCESS FULL| TEST_BIG | 72872 |  2063K|    55   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------------
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 2
可以看到官方文档中对于cost的解释最后一句The value of this column is a function of the CPU_COST and IO_COST columns.
看来还是很有必要来分析分析这个function是怎么回事了。
目录
相关文章
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
329 11
200行python代码实现从Bigram模型到LLM
|
数据采集 JSON 算法
Python爬虫——基于JWT的模拟登录爬取实战
Python爬虫——基于JWT的模拟登录爬取实战
291 1
Python爬虫——基于JWT的模拟登录爬取实战
|
7月前
|
开发者
云上玩转DeepSeek系列之六:DeepSeek云端加速版发布,具备超高推理性能
作为国内首个千亿级开源 MoE 模型,DeepSeek-R1 凭借其卓越的代码生成与复杂推理能力,已成为开发者构建智能应用的首选。然而,原始模型在产业落地中面临严峻挑战,部署 671B 满血版模型不仅硬件门槛要求很高,同时吞吐效率和响应延迟也受到了制约。PAI 正式推出了优化版 DeepSeek-R1 模型 DeepSeek-R1-PAI-optimized,将大模型推理效率推向了 Next Level。
|
7月前
|
存储 Unix Shell
Shell 输出命令完全指南:echo 与 printf 的深度剖析
本文深入解析了 Shell 编程中 `echo` 和 `printf` 两个核心输出命令的用法与区别。`echo` 简单易用,适合基础输出;`printf` 功能强大,支持复杂格式化。文章从语法、转义序列、高级技巧到实际应用场景(如日志记录、进度显示)逐一讲解,并对比两者的性能与适用场景,帮助开发者根据需求灵活选择。最后通过进阶技巧和常见问题解答,进一步提升对两者的掌握程度。
389 1
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
从平凡到非凡:借AI风口普通人如何起飞?
雷军曾说:“站在风口上,猪也能飞上天。”而AI无疑是当前最强劲的风口。本文介绍了如何抓住AI时代的机遇,包括理解AI基础概念、选择合适的AI工具、将AI融入工作提升效率,以及利用AI创造被动收入。通过这些步骤,你将能够在AI浪潮中获得成功。
548 0
从平凡到非凡:借AI风口普通人如何起飞?
|
11月前
|
敏捷开发 监控 数据可视化
实现SMART目标的工具有哪些?推荐5款适合团队和企业的目标管理工具
本文介绍了5款高效工具,包括Banli Kanban、Wrike、Airtable、Targetprocess和Basecamp,它们均能有效支持企业实现SMART目标的设定与管理。这些工具通过任务管理、进度跟踪、团队协作等功能,帮助企业确保目标的具体性、可衡量性、可达成性、相关性和时限性,提升工作效率和目标达成率。选择合适的工具需考虑企业的具体需求和规模。
实现SMART目标的工具有哪些?推荐5款适合团队和企业的目标管理工具
|
12月前
|
5G 网络架构
怎么区分5G卡片开启的网络类型是NSA(非独立组网)还是SA(独立组网)
要确定5G卡片开启的网络类型是NSA(非独立组网)还是SA(独立组网),你通常需要进行以下操作:
|
机器学习/深度学习 人工智能 监控
智能建筑管理系统:建筑能效的优化
【10月更文挑战第23天】智能建筑管理系统(IBMS)通过集成信息技术、自动化和通信技术,实现对建筑内设施的综合监控与管理,优化能效,提升舒适性和安全性。本文介绍IBMS的功能特点、应用成效及未来发展趋势,展示其在建筑能效优化中的重要作用。
|
安全 Ubuntu 搜索推荐
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
313 2