日期:2014-05-16  浏览次数:20379 次

一周以来遇到的问题和经验(oracle)

?

? ? ? 很久以前,在我还在X唐电信的时候,我被领导要求优化一段SQL。说真的那个时候我根本不知道SQL的优化为何物,但是百度google之后我发现所有的资料都写有这么一条:把选择性大的条件子句写在最后。因为oracle在执行的时候从底向顶执行。这句话我当时笃信不疑。可是后来我查到更多资料以及对SQL优化有了更深的理解之后,我发现那句话是RBO,而现在的oracle采取CBO。那么SQL到底是不是从下向上执行的?这个疑问后来在一次错误中被解决了。

? ? ? 有这么一个表,叫做test,有两个字段ser_id,area_id。但是我记不住了,我写了以下的SQL:

?

select * from test 
where area_id = 290 
and name = 'Lee'
and class_id = '201201';
复制代码

? ? ???执行一把:

?

? ? ? 系统会报错,但是系统不会说“name”也是无效的,只是检测出了class_id无效。这也就是说明,在进行语句的解析时,oracle确确实实是从下向上执行的。那么是不是说把选择性大的条件写到最底下会最快呢?我想这个还是靠执行计划说话。

? ? ? 还是这个test表,现在有12582912条数据,其中area_id=290的数据有4291456条,而ser_id=100001的有2097152条。很明显,area_id=290更具有选择性。好,现在SQL语句1如下:

?

select * from test
where ser_id = 100001
and area_id = 290;