比如特别大量的数据中,提取数据A列为ID号,B列为时间.假如这个数据是好几年的数据.
那么我有两个查询代码:Select A,B from tb where A like "A%" and B between 时间1 and 时间2

Select A,B from tb where B between 时间1 and 时间2 and A like "A%" 两段代码效率是否一样?又或者按照从左到右and的顺序依次来查询?希望大家指点.谢谢!

解决方案 »

  1.   

    -- 在字段A、B创建索引,
    -- 表中 A、B字段的顺序是什么,索引的顺序就与其相同,
    -- 查询的 Where 条件 其顺序也与表A、B字段的顺序一致!
      

  2.   

    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾好像基于CBO的,就没有顺序的区分...
      

  3.   


    DROP TABLE T PURGE;
    create table t(a varchar2(20), b date, c varchar2(20));
    insert into t(a,b,c) values('luoyoumou1',sysdate,'DBD');
    insert into t(a,b,c) values('Aluoyoumou1',sysdate-1,'ABC');
    insert into t(a,b,c) values('Bluoyoumou1',sysdate-2,'FFF');
    insert into t(a,b,c) values('Cluoyoumou1',sysdate-3,'GGG');
    insert into t(a,b,c) values('Auoyoumou1',sysdate-4,'GOGO');COMMIT;CREATE index t_inx on t(a,b);eygle@SZTYORA> set autotrace on;-- 你可以看到:以下两个查询都走了刚才创建的索引
    eygle@SZTYORA> select * from t where a like 'A%';A                                        B                   C
    ---------------------------------------- ------------------- ----------------------------------------
    Aluoyoumou1                              2010-07-22 10:09:47 ABC
    Auoyoumou1                               2010-07-19 10:09:47 GOGO已用时间:  00: 00: 00.07执行计划
    ----------------------------------------------------------
    Plan hash value: 1579008347-------------------------------------------------------------------------------------
    | Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |       |     2 |    66 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| T     |     2 |    66 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | T_INX |     2 |       |     1   (0)| 00:00:01 |
    -------------------------------------------------------------------------------------
    eygle@SZTYORA> select * from t where a like 'A%'
      2  and b between trunc(sysdate-1) and trunc(sysdate);A                                        B                   C
    ---------------------------------------- ------------------- ----------------------------------------
    Aluoyoumou1                              2010-07-22 10:09:47 ABC已用时间:  00: 00: 00.10执行计划
    ----------------------------------------------------------
    Plan hash value: 1074106765--------------------------------------------------------------------------------------
    | Id  | Operation                    | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |       |     1 |    33 |     2   (0)| 00:00:01 |
    |*  1 |  FILTER                      |       |       |       |            |          |
    |   2 |   TABLE ACCESS BY INDEX ROWID| T     |     1 |    33 |     2   (0)| 00:00:01 |
    |*  3 |    INDEX RANGE SCAN          | T_INX |     1 |       |     1   (0)| 00:00:01 |
    --------------------------------------------------------------------------------------
      

  4.   

    这样的话也就是说确实是影响速度的了?如果是日期间隔比较小的话应该是B(日期列)写在前面吧?
    Select A,B from tb where B between 时间1 and 时间2 and A like "A%"  
    不知道我理解的正确么?