全表扫描的COST计算
admin
2023-05-08 06:01:28
0次

SQL> create table test as select * from dba_objects where 1=0 ;

Table created.

SQL> alter table test pctfree 99 pctused 1;

Table altered.

SQL> insert into test select * from dba_objects where rownum<2;

1 row created.

SQL> alter table test minimize records_per_block;

Table altered.

SQL> insert into test select * from dba_objects where rownum<1000;

999 rows created.

commit;

BEGIN
  DBMS_STATS.GATHER_TABLE_STATS(ownname          =>'SCOTT',
                                tabname          =>'TEST',
                                estimate_percent =>100,
                                method_opt       =>'for all columns size 1',
                                degree           =>DBMS_STATS.AUTO_DEGREE,
                                cascade          =>TRUE);
END;
 /

PL/SQL procedure successfully completed.

SQL> select owner,blocks from dba_tables where owner='SCOTT' and table_name='TEST';

OWNER
----------------------------------------------------------------------------------------------------
    BLOCKS
----------
SCOTT
      1000

 

SQL> alter system set db_file_multiblock_read_count=16;

System altered.

 

SQL> set autot trace
SQL> select count(*) from test;


Execution Plan
----------------------------------------------------------
Plan hash value: 1950795681

-------------------------------------------------------------------
| Id  | Operation    | Name | Rows  | Cost (%CPU)| Time   |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |   | 1 |   220   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE    |   | 1 |        |   |
|   2 |   TABLE ACCESS FULL| TEST |  1000 |   220   (0)| 00:00:01 |
-------------------------------------------------------------------


Statistics
----------------------------------------------------------
  38  recursive calls
   0  db block gets
       1043  consistent gets
   0  physical reads
   0  redo size
 542  bytes sent via SQL*Net to client
 552  bytes received via SQL*Net from client
   2  SQL*Net roundtrips to/from client
   5  sorts (memory)
   0  sorts (disk)
   1  rows processed

全表扫描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秒

单块读的时间 = 寻道寻址+读一个块到内存的时间

SQL> select pname, pval1 from sys.aux_stats$ where sname='SYSSTATS_MAIN';

PNAME        PVAL1
------------------------------ ----------
CPUSPEED
CPUSPEEDNW   3308.9701
IOSEEKTIM          10
IOTFRSPEED        4096
MAXTHR
MBRC
MREADTIM
SLAVETHR
SREADTIM

9 rows selected.

单块读的时间:

sreadtim=ioseektim+db_block_size/iotfrspeed=10+9=8192byte/4096=12

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;

多块读:10 + 16*8k/4k=42

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;

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

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

 

 

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

 

 

explain plan for select count(*) from test;

SQL> select cpu_cost from plan_table;

  CPU_COST
----------
   7271440

   7271440

cost值:

SQL> select ceil((1000/16*42+7271440/3308.9701/1000)/12) from dual;

CEIL((1000/16*42+7271440/3308.9701/1000)/12)
--------------------------------------------
      219

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...