oracle 11.2.0.3全表扫描COST计算(工作量模式)

droptable testpurge;

 

createtable testasselect *from dba_objects;

 

--搜集统计信息,不搜集直方图信息

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;

/

select owner,blocksfrom dba_tableswhere owner='SCOTT'and table_name='TEST';

begin

   dbms_stats.set_system_stats('CPUSPEED',2500);

   dbms_stats.set_system_stats('SREADTIM',5);

   dbms_stats.set_system_stats('MREADTIM',30);

   dbms_stats.set_system_stats('MBRC',12);

end;

/

利用explainplan得到CPU_COST---这里等于 72735764

explainplan for select count(*) from test;

selectcpu_cost from plan_table;

 

成本计算公式如下:

Cost= (
       #SRds * sreadtim +
       #MRds * mreadtim +
       CPUCycles / cpuspeed /1000
       ) / sreadtime
       
#SRds - number of single block reads
#MRds - number of multi block reads
#CPUCyles - number of CPU cycles

sreadtim- single block read time
mreadtim - multi block read time
cpuspeed - CPU cycles per second

Cost = (
       #SRds * sreadtim+                           ---SRds=0
       #MRds * mreadtim+                         ---MRds=BLOCKS/MBCR=1105/12, mreadtim=30
       CPUCycles / cpuspeed /1000        ---CPUCycles=PLAN_TABLE.CPU_COST,cpuspeed=2500
       ) / sreadtime

注意这里的#mrds=BLOCKS/MBCR=1105/12

 

select ceil(1105/12*30/5)+ceil(19215491/2500/5/1000)+1from dual;

 

Select count(*) from test;

和执行计划得到的COST值一致

修改db_file_multiblock_read_count,看看COST值是否有改变,可以发现, 11.2.0.3在工作量模式下db_file_multiblock_read_count的修改不会影响COST的值,这个和非工作量模式恰恰相反

发布了19 篇原创文章 · 获赞 0 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章