ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 演示cpu cost 的几个例子

演示cpu cost 的几个例子

原创 Linux操作系统 作者:wei-xh 时间:2011-05-15 11:18:03 0 删除 编辑
------------创建一个表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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2315274