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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章