以下教大家怎样手工算出oracle运行计划中的cost值。

成本的计算方式例如以下:

Cost = (

       #SRds * sreadtim +

       #MRds * mreadtim +

       CPUCycles / cpuspeed

       ) / sreadtime





#SRds - number of single block reads 单块读个数     

#MRds - number of multi block reads  多块读个数     

#CPUCyles - number of CPU cycles     CPU时钟周期数  





sreadtim - single block read time    单块读耗时(单位milliseconds 毫秒,1000毫秒等于1秒

mreadtim - multi block read time     多块读耗时(单位milliseconds 毫秒,1000毫秒等于1秒)

cpuspeed - CPU cycles per second     CPU频率(单位MHZ)   单位是秒





mreadtim=ioseektim+db_file_multiblock_count*db_block_size/iotftspeed 

sreadtim=ioseektim+db_block_size/iotfrspeed

@脚本将在后面给出

SQL>create table aaa as select * from dba_objects where rownum<=10000;

SQL> conn scott/tiger 

Connected.

SQL> alter system set db_file_multiblock_read_count=16;

System altered.

SQL> explain plan for select count(*) from aaa;

Explained.



SQL> @getplan

'general,outline,starts'

Enter value for plan type:

PLAN_TABLE_OUTPUT

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

Plan hash value: 977873394

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

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

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

|   0 | SELECT STATEMENT   |      |     1 |    33   (0)| 00:00:01 |

|   1 |  SORT AGGREGATE    |      |     1 |            |          |

|   2 |   TABLE ACCESS FULL| AAA  | 10000 |    33   (0)| 00:00:01 |

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



SQL> @getmreadtime    --一次多块读的时间

  mreadtim

----------

        42

1 row selected.

SQL> @getsreadtime   --一次单块读的时间

  sreadtim

----------

        12

1 row selected.

SQL> @getcputime   --消耗的cpu的时间

    cputim

----------

.928809822

1 row selected.

SQL> @getmreadnum             --scott.aaa全表扫描是多块读须要的次数

Enter value for owner: scott

Enter value for table_name: aaa

  MREADNUM

----------

    8.8125

1 row selected.

SQL> @gettablecost           --计算出成本

Enter value for mreadtime: 42

Enter value for mreadnum:  8.8125

Enter value for cputime: 0.928809822

Enter value for sreadtime: 12



(42*8.8125+0.928809822)/12

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

                30.9211508

1 row selected.

conn /as sysdba

@getparam_imp                   --查隐含參数

Enter value for parameter_name:_table_scan_cost_plus_one

_table_scan_cost_plus_one                          TRUE



SQL> conn scott/tiger 

Connected.

SQL> alter session set "_table_scan_cost_plus_one"=false;

Session altered.

SQL> explain plan for select count(*) from aaa;

Explained.

SQL> @getplan

'general,outline,starts'

Enter value for plan type:

PLAN_TABLE_OUTPUT

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

Plan hash value: 977873394





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

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

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

|   0 | SELECT STATEMENT   |      |     1 |    32   (0)| 00:00:01 |

|   1 |  SORT AGGREGATE    |      |     1 |            |          |

|   2 |   TABLE ACCESS FULL| AAA  | 10000 |    32
  (0)| 00:00:01 |

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

--下面是@脚本

--@getmreadtime

select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +

       (select value from v$parameter where name = 'db_file_multiblock_read_count') * 

       (select value from v$parameter where name = 'db_block_size') / 

       (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "mreadtim"

   from dual;

--@getsreadtime

select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +

       (select value from v$parameter where name = 'db_block_size') /

       (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "sreadtim"

  from dual;

--@getcputime

select (select distinct cpu_cost from plan_table where cpu_cost is not null)/

       (select pval1 from sys.aux_stats$ where sname='SYSSTATS_MAIN' and pname='CPUSPEEDNW')/

       1000 "cputim"

  from dual;

--@getmreadnum

select (select BLOCKS from dba_tables where owner=upper('&owner') and table_name=upper('&table_name'))/

       (select value from v$parameter where name = 'db_file_multiblock_read_count') "mreadnum"

  from dual;

@gettablecost

select (&mreadtime*&mreadnum+&cputime)/&sreadtime from dual;

--@getparam_imp  

SELECT nam.ksppinm NAME, val.ksppstvl VALUE  

  FROM sys.x$ksppi nam, sys.x$ksppsv val  

 WHERE nam.indx = val.indx  

   AND nam.ksppinm LIKE '%&&parameter_name%'  

 ORDER BY 1;

--@getplan

set feedback off

pro 'general,outline,starts'

pro

acc type prompt 'Enter value for plan type:' default 'general'

select * from table(dbms_xplan.display) where '&&type'='general';

select * from table(dbms_xplan.display(null, null,'advanced -projection')) where '&&type'='outline';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST')) where '&&type'='starts';

set feedback on

undef type

/

转载请注明本文地址

计算cost--全表扫描的更多相关文章

  1. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析

    在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...

  2. SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析 (转载)

    在SQL SERVER的查询语句中使用OR是否会导致不走索引查找(Index Seek)或索引失效(堆表走全表扫描 (Table Scan).聚集索引表走聚集索引扫描(Clustered Index ...

  3. mysql优化器在统计全表扫描的代价时的方法

    innodb 的聚集索引 的叶子结点 存放的 是 索引值以及数据页的偏移量 那么在计算全表扫描的代价是怎么计算的呢? 我们知道代价 为 cpu代价+io代价 cpu代价 就是 每5条记录比对 计算一个 ...

  4. 优化一个奇葩表设计上的全表扫描SQL

    之前在一个比较繁忙的系统抓到的耗时长.消耗CPU多的一条SQL,如下:SELECT * FROM Z_VISU_DATA_ALARM_LOG TWHERE TO_DATE(T.T_TIMESTR, ' ...

  5. MySql避免全表扫描【转】

    原文地址:http://blog.163.com/ksm19870304@126/blog/static/37455233201251901943705/ 对查询进行优化,应尽量避免全表扫描,首先应考 ...

  6. Oracle 表的访问方式(1) ---全表扫描、通过ROWID访问表

    1.Oracle访问表的方式 全表扫描.通过ROWID访问表.索引扫描 2.全表扫描(Full Table Scans, FTS) 为实现全表扫描,Oracle顺序地访问表中每条记录,并检查每一条记录 ...

  7. Oracle全表扫描

    优化器在形成执行计划时需要做的一个重要选择——如何从数据库查询出需要的数据.对于SQL语句存取的任何表中的任何行,可能存在许多存取路径(存取方法),通过它们可以定位和查询出需要的数据.优化器选择其中自 ...

  8. MySql避免全表扫描

    对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_name为 ...

  9. Oracle 高水位线和全表扫描

    --Oracle 高水位线和全表扫描--------------------------2013/11/22 高水位线好比水库中储水的水位线,用于描述数据库中段的扩展方式.高水位线对全表扫描方式有着至 ...

  10. 表访问方式---->全表扫描(Full Table Scans, FTS)

    全表扫描(Full Table Scans, FTS) 全表扫描是指Oracle在访问目标表里的数据时,会从该表所占用的第一个区(EXTENT)的第一个块(BLOCK)开始扫描,一直扫描到该表的高水位 ...

随机推荐

  1. CSS——样式初始化

    腾讯: body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;p ...

  2. 微信小程序php后台实现

    这里简单介绍用php后台实现获取openid并保存到数据库: 微信的登陆流程是这样的 首先前端发送请求到服务器: wx.login({ success: function (res) { var co ...

  3. Centos6.7安装Cacti教程

    Centos6.7安装Cacti教程# link:http://docs.cacti.net/plugins/ blog地址:http://www.cnblogs.com/caoguo 一.基本环境安 ...

  4. js 闭包 定时器

    ; !function (win) { ; //内部私有 , ; //内部私有 //test.prototype.tt1 = 0;//共有变量 var test = function () {}; t ...

  5. git clone下载代码,中途断掉怎么办?

    问题如下: 解决办法: 1)运行以下命令进行clone $ git clone --recursive https:xxxxxx 2)进入项目根目录,继续下载 $ cd eigen-git-mirro ...

  6. 【VIP视频网站项目】VIP视频网站项目v1.0.3版本发布啦(程序一键安装+电影后台自动抓取+代码结构调整)

    在线体验地址:http://vip.52tech.tech/ GIthub源码:https://github.com/xiugangzhang/vip.github.io 项目预览 主页面 登录页面 ...

  7. postgres主从配置

    运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 开始部署postgres主从(如果没不会安装postgres的请去上一个博文中查看) 这里我使用了两台服务器部署 主:192.168 ...

  8. max_element()与min_element()

    #include<iostream>#include<algorithm>using namespace std;bool cmp(int i,int j){ return i ...

  9. [poj1062]昂贵的聘礼_最短路_离散化

    昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...

  10. [转]十五天精通WCF——第五天 你需要了解的三个小技巧

    一: 服务是端点的集合 当你在开发wcf的时候,你或许已经注意到了一个service可以公布多个endpoint,确实是这样,在wcf中有一句很经典的话,叫做“服务是端点的集合",就 比如说 ...