演示cpu cost 的几个例子

------------创建一个表T1,列V1,N2值是一样的从0~19,只是字段类型不一样,列N1从1~3000,数值型的
------------表创建语句取自CBO那本书
create table t1(
v1,
n1,
n2
)
as
select
to_char(mod(rownum,20)),
rownum,
mod(rownum,20)
from
all_objects
where
rownum <= 3000
;

------------------构造查询语句
select
v1, n2, n1
from
t1
where
v1 = '1'
and n2 = 18
and n1 = 998
;

-----------------看下默认的谓词过滤顺序
SQL> explain plan for
  2  select
  3  v1, n2, n1
  4  from
  5  t1
  6  where
  7  v1 = '1'
  8  and n2 = 18
  9  and n1 = 998
10  ;

已解释。
SQL> select substr(filter_predicates,1,60) Filter, cpu_cost CPU from plan_table where id = 1;

FILTER                                                              CPU
------------------------------------------------------------ ----------
"N1"=998 AND "V1"='1' AND "N2"=18                                784145
以前一直忽视了执行计划谓词过滤的顺序了,我们看到ORACLE做了调整,我们SQL书写的顺序跟ORACLE的过滤顺序之间有差异
由于N1的区别度较高,因此通过N1过滤后,所剩的行数就寥寥无几了
这里的CPU成本为
3000次比较的成本3000次比较后,能过滤出只剩一行,然后这一行再与后面两个谓词分别继续做比较的成本,我们算它为2次
因此成本也就3002次CUP计算

-----------------------"V1"='1' AND "N1"=998 AND "N2"=18情况下CPU的COST
我们在看看增加HINT后,强制按照我们的谓词顺序来过滤,CPU成本是怎么样的
explain plan for
select
/*+ cpu_costing ordered_predicates */
v1, n2, n1
from
t1
where
v1 = '1'
and n1 = 998
and n2 = 18
;
SQL> select substr(filter_predicates,1,60) Filter, cpu_cost CPU from plan_table where id = 1;

FILTER                                                              CPU
------------------------------------------------------------ ----------
"V1"='1' AND "N1"=998 AND "N2"=18                                791595
可以看到CUP的成本比上面大了,791595>784145
由于V1的选择度只有1/20分之一,通过他过滤后,还剩150行,N1选择度比较高,通过他过滤后就只剩一行了
因此CUP成本就是3000次过滤+150次过滤+1次过滤=3151次CUP计算

---------------------------------"V1"='1' AND "N2"=18 AND "N1"=998 情况下CPU的COST
继续看下一种情况
explain plan for
select
/*+ cpu_costing ordered_predicates */
v1, n2, n1
from
t1
where
v1 = '1'
and n2 = 18
and n1 = 998
;
SQL> select substr(filter_predicates,1,60) Filter, cpu_cost CPU from plan_table where id = 1;

FILTER                                                              CPU
------------------------------------------------------------ ----------
"V1"='1' AND "N2"=18 AND "N1"=998                                791968
可以看到CUP的成本比上面大,791968>791595
由于V1的选择度只有1/20分之一,通过他过滤后,还剩150行,N2的选择度也不高,也是1/20,过滤后还剩7.5行
因此他的CUP成本就是3000次的过滤+150次的过滤+7.5次的过滤=3157.5次CPU计算


PS:本文涉及的CPU计算次数只是为了描述起来方便,精确的计算是PLAN_TABLE的CPU_COST列,代表CUP运算的次数。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22034023/viewspace-695401/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22034023/viewspace-695401/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值