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的值,這個和非工作量模式恰恰相反