以下计算执行计划中表扫描的成本实验是在AIX平台下10.2.0.1进行的:
1、创建测试表
SQL>execute dbms_random.seed(0);
SQL>create table t1
pctfree 99
pctused 1
as
with generator as (
select --+ materialize
rownum id
from all_objects
where rownum <=3000
)
select /*+ ordered use_nl(v2) */
rownum id,
trunc(100*dbms_random.normal) val,
rpad('x', 100) padding
from
generator v1,
generator v2
where rownum <=10000;
2、进行统计分析
SQL>begin
dbms_stats.gather_table_stats(
user,
't1',
cascade =>true,
estimate_percent => null,
method_opt => 'for all columns size 1'
);
end;
/
3、查看实际的IO和CPU成本
SQL>alter system flush shared_pool;
SQL>alter session set events '10053 trace name context forever, level 2';
SQL>select max(val) from t1;
SQL>alter session set events '10053 trace name context off';
提取跟踪文件相应数值:
跟踪文件:
cost_io=2221
cost_cpu=73954130
#Blks = 10146
cost=2228.75
4、10g下noworkload统计信息以及相关参数查询
SQL>select pname, pval1 from sys.aux_stats$
where sname='SYSSTATS_MAIN';
PNAME PVAL1
------------------------------ ----------
CPUSPEEDNW 795.134
IOSEEKTIM 10
IOTFRSPEED 4096
SQL>show parameter DB_FILE_MULTIBLOCK_READ_COUNT;
DB_FILE_MULTIBLOCK_READ_COUNT=16
该数值匹配到计算公式中mbrc
5、ORACLE10g的成本计算公式
cost = (#SRDs * SREADTIM +
#MRDs * MREADTIM +
#CPUCycles/cpuspeed)/SREADTIM
= #SRDs + --因为是表扫描,所以该值为0
#MRDs * MREADTIM/SREADTIM + -- IO cost
#CPUCycles/(cpuspeed * SREADTIM) -- CPU cost
6、手工计算IO成本,看是否与步骤2中IO成本实际值匹配
手工计算:
cost_io= #MRDs * MREADTIM/SREADTIM,所得数值取最大整数,另外隐含参数_table_scan_cost_plus_one=true,所以cost_io需要添加1。所以10g实际公式为:
cost_io=ceiling(#MRDs * MREADTIM/SREADTIM) +1
其中:
#MRDs=#Blks/mbrc=10146/16
MREADTIM=IOSEEKTIM + mbrc*db_block_size/IOTFRSPEED
= 10+ 16*8k/4k=42
SREADTIM=IOSEEKTIM + db_block_size/IOTFRSPEED
=10+8k/4k=12
cost_io=ceiling(10146/16*42/12)+1=ceiling(2219.4375)+1=2220+1=2221
计算值与步骤2中实际IO成本cost_io=2221一致。
7、手工计算CPU成本
cpu成本=#CPUCycles/(cpuspeed * SREADTIM)
其中
#CPUCycles等于10053跟踪文件中cost_cpu=73954130,
cpuspeed=795.134MHz=795134Hz
SREADTIM=12
所以
cpu成本=73954130/(795134*12)=7.75
8、总的成本计算值
cost=cost_io+ cpu成本=2221+7.75=2228.75
以上的计算值与实际所获得的成本值完全一致。
备注:来源于Jonathan Lewis的《CBO基础》第二章节tablescan。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/354732/viewspace-613476/
,如需转载,请注明出处,否则将追究法律责任。