zoukankan      html  css  js  c++  java
  • 对Cost (%CPU) 粗略的理解

    今天研究执行计划,看到执行计划里面有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 是对没有进行的动态

  • 相关阅读:
    值得学习的C语言开源项目
    iOS – 使用UINib加载xib文件实现UITableViewCell
    iOS – 滚动视图(UIScrollView)详解
    oracle的体系结构之网络配置和登录验证(四)
    oracle的体系结构之存储结构(三)
    oracle的体系结构之权限管理和用户schema(二)
    oracle的体系结构之基本概念(一)
    C++ 闭包(closure)
    C++ Lambda 表达式
    C++ 类成员的构造和析构顺序
  • 原文地址:https://www.cnblogs.com/softidea/p/3850162.html
Copyright © 2011-2022 走看看