Oracle SQL优化之SQL编写顺序

版权声明: https://blog.csdn.net/Dongguabai/article/details/84304754

关于SQL的编写顺序有这样的说法:

多表查询顺序

下面来测试一下:

drop table tab_big;
drop table tab_small;
create table tab_big  as select * from dba_objects where rownum<=30000;
create table tab_small  as select * from dba_objects where rownum<=10;
set autotrace traceonly
set linesize 1000
set timing on 

再来执行:

select count(*) from tab_big,tab_small   ;  

运行结果:

再来执行:

发现两条SQL的效率差不多。

由于我用的是Oracle 11g,优化器为CBO,接下来添加/*+rule*/ 使用RBO(关于RBO和CBO具体可参看:https://blog.csdn.net/Dongguabai/article/details/84305036)执行:

发现两者的效率差别还是挺大的,大表在前的确效率更快,说明其实任何谣言,都是有一定的影子的,不过已经过时了。RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,ORACLE已经彻底丢弃了RBO。现在SQL编写不需要考虑多表查询顺序。

WHERE字句中的条件顺序

执行测试脚本:

drop table t1 purge;
drop table t2 purge;
create table t1 as select * from dba_objects;
create table t2 as select rownum id ,dbms_random.string('b', 50) n ,data_object_id data_id from dba_objects where rownum<=10000;
set autotrace traceonly
set linesize 1000
set timing on

基于RBO执行测试SQL:

发现效率并没有什么区别,再加个关联条件看看:

发现同样也没什么区别,因此可以得出结论:基于RBO或许是如此,基于CBO时代,早就不是如此了,过时了。

猜你喜欢

转载自blog.csdn.net/Dongguabai/article/details/84304754
今日推荐