CBO(基于COST的优化器)会根据统计信息自动选择执行顺序。如果采用CBO那么两种写法没有区别。但是,RBO(基于规则的优化器)会严格从右至左进行过滤。

解决方案 »

  1.   

    RBO下也不一定是严格按从右至左进行过滤。测试如下:
    SQL> create table test_a tablespace users as select * from all_objects;Table created.SQL> create table test_b tablespace users as select * from all_objects;Table created.SQL> set autotrace traceonly;
    SQL> select /*+ rule */ b.object_name, b.owner from test_a a, test_b b where a.object_id>10000 and a.object_id=b.object_id;19090 rows selected.
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   MERGE JOIN
       2    1     SORT (JOIN)
       3    2       TABLE ACCESS (FULL) OF 'TEST_B'
       4    1     SORT (JOIN)
       5    4       TABLE ACCESS (FULL) OF 'TEST_A'
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           1626  consistent gets
           1618  physical reads
              0  redo size
         637714  bytes sent via SQL*Net to client
          14503  bytes received via SQL*Net from client
           1274  SQL*Net roundtrips to/from client
              2  sorts (memory)
              0  sorts (disk)
          19090  rows processedSQL> select /*+ rule */ b.object_name, b.owner from test_a a, test_b b where a.object_id=b.object_id and a.object_id>10000;19090 rows selected.
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=HINT: RULE
       1    0   MERGE JOIN
       2    1     SORT (JOIN)
       3    2       TABLE ACCESS (FULL) OF 'TEST_B'
       4    1     SORT (JOIN)
       5    4       TABLE ACCESS (FULL) OF 'TEST_A'
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           1626  consistent gets
              0  physical reads
              0  redo size
         637714  bytes sent via SQL*Net to client
          14503  bytes received via SQL*Net from client
           1274  SQL*Net roundtrips to/from client
              2  sorts (memory)
              0  sorts (disk)
          19090  rows processedSQL>
      

  2.   

    a.id>1000过滤在先,只有两个表的table scan后才有表连接,可以从执行计划中看出.