------------创建一个表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运算的次数。
------------表创建语句取自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/