ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 执行计划中COST(%CPU)列值不可信

执行计划中COST(%CPU)列值不可信

原创 Linux操作系统 作者:buliaoqingtian 时间:2019-02-14 14:42:05 0 删除 编辑

使用AUTOTRACE功能查看执行计划和统计信息时,执行计划中的COST(%CPU)这项数据是根据表最新的分析结果,而得到的。因此这项值有可能是不真实的。请看下面这个测试。表TEST数据量有1千万。

SQL> select * from test;

11394428 rows selected.

Elapsed: 00:03:30.80

Execution Plan

----------------------------------------------------------

Plan hash value: 511800663

-----------------------------------------------------------------------------------

| Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |               |   174K|  9191K|   397   (1)| 00:00:05 |

|   1 |  TABLE ACCESS FULL| test          |   174K|  9191K|   397   (1)| 00:00:05 |

-----------------------------------------------------------------------------------

Statistics

----------------------------------------------------------

        156  recursive calls

          0  db block gets

     889643  consistent gets

     130462  physical reads

          0  redo size

 1082613512  bytes sent via SQL*Net to client

    8356428  bytes received via SQL*Net from client

     759630  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

   11394428  rows processed

SQL>EXEC dbms_stats.gather_table_stats(ownname => 'TEST',tabname => 'TEST');

PL/SQL procedure successfully completed

11394428 rows selected.

Elapsed: 00:03:30.95

Execution Plan

----------------------------------------------------------

Plan hash value: 511800663

-----------------------------------------------------------------------------------

| Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |               |    11M|   836M| 35483   (1)| 00:07:06 |

|   1 |  TABLE ACCESS FULL| TEST          |    11M|   836M| 35483   (1)| 00:07:06 |

-----------------------------------------------------------------------------------

Statistics

----------------------------------------------------------

          0  recursive calls

          0  db block gets

     889617  consistent gets

     130460  physical reads

          0  redo size

 1082613512  bytes sent via SQL*Net to client

    8356428  bytes received via SQL*Net from client

     759630  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

   11394428  rows processed

从上面的测试结果可以看到前后的COST值不一样,当然前者没有分映真实情况,而在对表进行实时分析后,再查看SQL的执行计划,COST值就对了。但时我们也可以看到前后两次的物理读都是一样,这里也提示,如果我们在分析一个SQL语句的性能时,最可靠的还是统计分析数值,当执行计划里的COST值我们感觉不可信时,就不要它了,直接根据物理读和内存读来看SQL的性能如何。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/526592/viewspace-750051/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: ORA-600之于数据库
请登录后发表评论 登录
全部评论

注册时间:2005-08-03

  • 博文量
    88
  • 访问量
    106023