今天研究执行计划,看到执行计划里面有Cost (%CPU),我这边研究了一把,不知道对与否,拿出来晒晒

在Oracle 10g中,Oracle 把CPU的cost也统计在执行计划中去了, 这和以前的8i,9i(9i其实已经开始了)有很大的不同。

所以用一个公式来表示cost,可以简单的写成

Cost = I/O cost + CPU cost

我虚拟机的Oracle版本是10.2.0.1

SQL> select * from dumptest;

50763 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 3522420958

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          | 50763 |  4610K|   215   (3)| 00:00:02 |
|   1 |  TABLE ACCESS FULL| DUMPTEST | 50763 |  4610K|   215   (3)| 00:00:02 |
------------------------------------------------------------------------------

在这个例子中,全表扫描的cost是215(3)

那215是整个这个步骤的cost,那和它相关的CPU 和 I/O cost 分别是多少呢,可以通过v$sql_plan来查到

SQL> select cost, cpu_cost, io_cost from v$sql_plan sql where sql.plan_HASH_VALUE = '3522420958'
  2  ;

COST   CPU_COST    IO_COST
---------- ---------- ----------
       215
       215   24910764        209

大家可以看到,第二步中IO_COST是209,总的cost是215,那么CPU的cost是多少呢 (215-209)/215 = 3%

SQL> select (215-209)/215 from dual;

(215-209)/215
-------------
   .027906977

所以这个Cost (%CPU)含义就是CPU cost在整个cost中占的百分比

至于byte的来源,它是来源于表的统计信息中的avg_row_len

SQL> select avg_row_len from user_tables where table_name = upper('dumptest')
  2  ;

AVG_ROW_LEN
-----------
         93

那我们第二步中的返回的bytes长度为

Rows × 93 == (50763 × 93) /1024 == 4610k

SQL> select (50763*93)/1024 from dual;

(50763*93)/1024
---------------
     4610.31152

那肯定有朋友会问,如果我没有统计信息,这个byte还会出来嘛

看一下下面的操作

SQL> exec dbms_stats.delete_table_stats(USER, 'DUMPTEST');

PL/SQL procedure successfully completed

SQL> select avg_row_len from user_tables where table_name = upper('dumptest')
  2  ;

AVG_ROW_LEN
-----------

SQL> set autotrace traceonly
SQL> select * from dumptest;

Execution Plan
----------------------------------------------------------
Plan hash value: 3522420958

------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          | 42043 |  7267K|   214   (3)| 00:00:02 |
|   1 |  TABLE ACCESS FULL| DUMPTEST | 42043 |  7267K|   214   (3)| 00:00:02 |
------------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

结果出来虽然cost没啥大变化,但返回的rows 和 bytes数却差了好多,我觉得这个是Oracle采用dynamic sampling后的结果

cpu  COST的计算没有明确的文档 但是COST是
在noworkload statistics下
cost=io_cost+cpu_cost/cpuspeednw*(ioseektim+db_block_size/iotfrspeed)*1000
而在workload statistic下
COST=IO_COST+cpu_cost/cpuspeed*sreadtim*1000

dynamic sampling used for this statement
动态采样表示ORACLE在没有统计信息的情况下做的

统计信息过旧是在收集统计信息ORACLE 对一段时间来过多DML对象确定的。然后对过旧统计信息表的信息进行收集

http://space.itpub.net/7728585/viewspace-624471

动态采用也可以在有统计信息的时候使用,这取决于你的Dynamic Sampling Levels

http://download.oracle.com/docs/ ... 11/stats.htm#i43032

Dynamic Sampling在你测试SQL性能问题是不是由于oracle的统计信息有问题或oracle CBO算法问题的时候有用。

是的一共有10个级别 默认就是2 是对没有进行的动态

转载于:https://www.cnblogs.com/softidea/p/3850162.html

对Cost (%CPU) 粗略的理解相关推荐

  1. RT-Thread 的 CPU 固件移植理解

    RT-Thread 的 CPU 固件移植理解 博主介绍 RT-Thread 的 CPU 抽象层 STM32CubeMX 固件工具 RT-Thread 的 BSP

  2. cpu架构----通俗理解

    说法一 CPU历来都是一个高大上的话题,普通吃瓜群众除了CPU越贵越好之外,可能就一无所知了.曾经小编对于CPU也是一头雾水,后来请教了很多大神,又查阅了很多资料,才粗略地搞明白了一点.在此,小编就按 ...

  3. CPU 是如何理解 01 二进制的?

    CPU就像一个单细胞一样,本身不具备任何思考能力,没什么自己的想法,你给它一个刺激,它只是简单的会有一个反应. 准确的来说, CPU不认识也不理解任何东西. CPU就像一个单细胞一样,本身不具备任何思 ...

  4. 多核cpu与多线程理解

    计算机cpu与多线程 进程和线程: 进程包含线程,一个进程中包含多个线程. 线程是cpu调度和分配的基本单位,进程是操作系统进行资源分配(cpu,内存,硬盘io等)的最小单位. 单核cpu: 实现多进 ...

  5. Linux CPU 100%问题 | 理解 CPU负载和 CPU使用率

    CPU 负载和 CPU 使用率 这两个从一定程度上都可以反映一台机器的繁忙程度. CPU 使用率反映的是当前 CPU 的繁忙程度,忽高忽低的原因在于占用 CPU 处理时间的进程可能处于 IO 等待状态 ...

  6. 通过自制CPU来彻底理解CPU的工作原理

    每天摸着CPU,摸了20多年,却总是无法彻底理解CPU的工作原理,还有比这更郁闷的事吗?所以我决定攻克这一世界(我个人的世界)难题,自己做一个CPU来理解CPU的工作原理. " 造一个什么样 ...

  7. linux的cpu信息怎么理解,理解Linux下的CPU信息:lscpu cpuinfo

    通过lscpu命令,可以看到CPU的一些基本信息.如下所示,可以很清楚的看到这台服务器使用两个物理socket,每个socket上有6个core,每个core上有两个线程(超线程),所以一共有2 * ...

  8. linux cpu load 值,理解Linux系统中的load average(图文版)转

    一.什么是load average? linux系统中的Load对当前CPU工作量的度量 (WikiPedia: the system load is a measure of the amount ...

  9. 磁卡、ID卡、IC卡、M1卡、CPU卡的理解区分

    一.磁卡 磁卡是在一张塑料片上均匀地涂布上一层磁性微 粒材料制成的. 刚生产出来的磁卡上面的磁性微粒是不显磁性的, 这样的磁卡就象一张白纸, 人们需要在磁卡里输入一些信息才能使用. 那么信息是怎样被记 ...

最新文章

  1. SharePoint中Tab方式进行内容展现的WebPart
  2. TCP/IP / UDP 头
  3. 阿里双十一秒杀系统架构设计,有哪些技术关键点?
  4. RAID信息存放位置!
  5. 堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构
  6. easyui图标代码
  7. centos oracle libaio哪下载,linux 安装libaio
  8. APP脱壳之MDEX的使用步骤
  9. JanusGraph配置
  10. 【阿朱归类】2015 新兴互联网公司 TOP 300
  11. Alt键一直处于按下状态 解决办法
  12. linux系统fasta程序,fasta格式文件处理大全(一)
  13. WEB前端打印使用记录
  14. iOS之ffmpeg开发音视频编解码概要、SDL
  15. oppo手机安装应用失败,提示版本不兼容
  16. 使用 SimpleWebRTC 构建 WebRTC 视频聊天应用程序
  17. gtx1060 3g和6g性能差距 gtx1060 3g和6g吃鸡区别
  18. 网易云课堂web安全学习第七天——了解url跳转漏洞
  19. 快速定量,Abbkine 蛋白质定量试剂盒BCA法来了!
  20. jQuery css选择器大全,总有你用得到的东西。

热门文章

  1. SpringBoot源码分析之@Scheduled
  2. Linux下文件如果没有权限不能被Apache访问
  3. Visual C#创建资源文件
  4. c#.net常用函数和方法集
  5. Linux上隐藏进程名(初级版)
  6. 激活函数之logistic sigmoid函数介绍及C++实现
  7. C++/C++11中std::priority_queue的使用
  8. window7系统中64位安装matalbR2009b后出现乱码的解决方案
  9. 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案
  10. activiti工作流连接mysql_Activiti工作流 安装myeclipse activiti设计插件并生成数据库表...