各位大虾们,小弟有个问题不解,望各位给点帮助我在Table_name 表中建立索引
create index I_VEHICLEPASS_COM2 on Table_name (PASSTIME,crosslsh,PLATEINFO)
create bitmap index I_VEHICLEPASS_COM1 on Table_name (crosslsh);select count(1)
          from TABLE_NAME v
         where  passTime >=
               to_timestamp('2011-5-1 00:00:00', 'yyyy-mm-dd HH24:MI:SS')
           and passTime <=
               to_timestamp('2011-5-30 23:59:59', 'yyyy-mm-dd HH24:MI:SS')
           and CROSSLSH in (21)
           and plateInfo like '%'
1 Plan hash value: 939785991
2  
3 -----------------------------------------------------------------------------------------
4 | Id  | Operation          | Name               | Rows  | Bytes | Cost (%CPU)| Time     |
5 -----------------------------------------------------------------------------------------
6 |   0 | SELECT STATEMENT   |                    |     1 |    23 | 26558   (2)| 00:05:19 |
7 |   1 |  SORT AGGREGATE    |                    |     1 |    23 |            |          |
8 |*  2 |   FILTER           |                    |       |       |            |          |
9 |*  3 |    INDEX RANGE SCAN| I_VEHICLEPASS_COM2 |   293K|  6588K| 26558   (2)| 00:05:19 |
10 -----------------------------------------------------------------------------------------
11  
12 Predicate Information (identified by operation id):
13 ---------------------------------------------------
14  
15    2 - filter(TO_TIMESTAMP('2011-5-1 00:00:00',:B1)<=TO_TIMESTAMP('2011-5-30 
16               23:59:59',:B2))
17    3 - access("PASSTIME">=TO_TIMESTAMP('2011-5-1 00:00:00',:B1) AND 
18               "CROSSLSH"=21 AND "PASSTIME"<=TO_TIMESTAMP('2011-5-30 23:59:59',:B2))
19        filter("CROSSLSH"=21 AND "PLATEINFO" LIKE '%')
这里用来索引
但是我再加一个条件  就不用索引,而是进行全部扫描
select count(1)
          from TABLE_NAME v
         where  passTime >=
               to_timestamp('2011-5-1 00:00:00', 'yyyy-mm-dd HH24:MI:SS')
           and passTime <=
               to_timestamp('2011-5-30 23:59:59', 'yyyy-mm-dd HH24:MI:SS')
           and CROSSLSH in (21)
           and plateInfo like '%'
           and drivewayNumber = '1'
1 Plan hash value: 477241886
2  
3 -------------------------------------------------------------------------------------------
4 | Id  | Operation           | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
5 -------------------------------------------------------------------------------------------
6 |   0 | SELECT STATEMENT    |                     |     1 |    26 |   205K  (3)| 00:41:06 |
7 |   1 |  SORT AGGREGATE     |                     |     1 |    26 |            |          |
8 |*  2 |   FILTER            |                     |       |       |            |          |
9 |*  3 |    TABLE ACCESS FULL| TABLE_NAME          | 24445 |   620K|   205K  (3)| 00:41:06 |
10 -------------------------------------------------------------------------------------------
11  
12 Predicate Information (identified by operation id):
13 ---------------------------------------------------
14  
15    2 - filter(TO_TIMESTAMP('2011-5-1 00:00:00',:B1)<=TO_TIMESTAMP('2011-5-30 
16               23:59:59',:B2))
17    3 - filter("CROSSLSH"=21 AND "DRIVEWAYNUMBER"=1 AND 
18               "PASSTIME"<=TO_TIMESTAMP('2011-5-30 23:59:59',:B1) AND 
19               "PASSTIME">=TO_TIMESTAMP('2011-5-1 00:00:00',:B2) AND "PLATEINFO" LIKE '%')这是为什么呢? 很困惑啊! 望大虾赐教……!!!
谢谢!

解决方案 »

  1.   

    自己建了个表试了一下,更加不明白了。。话说在WHERE中 如果有字段 使用LIKE并且通配符% 在第一的位置的是使用不了索引的。所以最令我好奇的不是不能用了,而是之前的为什么能用。至于你的问题,为什么前一个能用而后一个不能用,我只知道你添加一个WHERE条件以后改变了sql的结构,使得ORACLE优化器重新优化了你的SQL语句,并产生了新的执行计划。
    Plan hash value: 939785991
    Plan hash value: 477241886
    这表示两个执行计划不同。
      

  2.   

    兄弟,这有个连接,讲的好像和你的情况有关系,你看看
    http://www.cnblogs.com/tearelish/archive/2008/08/19/1271737.html
      

  3.   

    在where条件中    使用LIKE并且通配符% 在第一的位置  还是使用不了索引,应该是因为我建的联合索引中,第一个字段是PASSTIME,而不是使用了like的  PLATEINFO字段,所以索引也能用吧!  确实是用来不同的执行计划  我把执行计划改为 FIRST_ROWS  ,下面的查询也就走索引了!
      

  4.   

    可以重新收集统计信息,然后不加first_rows hints提示 试试