版权声明: 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时代,早就不是如此了,过时了。