存在一个分段表,根据字段umEventTimestamp进行分段,字段umEventTimestamp上存在一个位图索引。在进行如下查询时,竟然进行全部扫描,如何理解? 谢谢!explain plan的输出:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1319849956
--------------------------------------------------------------------------------
| Id  | Operation               | Name                      | Rows  | Bytes |Tem
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT        |                           |  7086K|  1351M|
|   1 |  SORT GROUP BY          |                           |  7086K|  1351M|  4
|   2 |   PARTITION RANGE SINGLE|                           |    10M|  1911M|
|*  3 |    TABLE ACCESS FULL    | PARTITION_TEST_LOCALINDEX |    10M|  1911M|
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("UMEVENTTIMESTAMP">=0 AND "UMEVENTTIMESTAMP"<1000000)查询语句:
explain plan for select  UMBsid, UMAccessType, AVG(UMBsActiveUser) 
               from partition_test_localindex  where umEventTimestamp >= 0 and umEventTimestamp < 1000000 group by UMBsid, UMAccessType order by UMBsid, UMAccessType;      表和索引的定义:
create table on partition_test_localindex
(
umID NUMERIC (10) NOT NULL,
umPDN VARCHAR (200) NOT NULL,
umBSID VARCHAR (200),
umAccessType NUMERIC (10),
umEventTimestamp NUMERIC(19),
umBsActiveUser NUMERIC (20),
umBsInactiveUser NUMERIC (20),
umBsLocalUser NUMERIC (20)
)
PARTITION BY RANGE (umEventtimestamp)
(
        PARTITION p20120501 VALUES LESS THAN (20000000),
        PARTITION p20120502 VALUES LESS THAN (40000000),
        PARTITION p20120503 VALUES LESS THAN (60000000),
);
create  bitmap Index partition_test_localindex_1 on partition_test_localindex (umEventTimestamp) Local;

解决方案 »

  1.   

    不一定有索引,就一定要走索引的;
    如果ORACLE分析,走索引的效率不如全表扫描的话,那么查询计划就是全表扫描
      

  2.   

     一般情况下:如果查询结果的条数占整个表的总条数的比率约大,索引效率越低。一般百分之几是可以的,再大就不太好了。因为,在Oracle中所谓的查询效率高,指的是读取尽量少的块,获取尽量多的查询结果。如果是用的是B-Tree索引等,由于每条数据的查询,至少要先从硬盘读索引,然后再根据索引的ROWID去获取数据,因此数据条数多了,反而会读更多的块,因此效率就低了。希望说的能帮上你。
      

  3.   

    oracle 优化器 会根据 数据表的大小和你获取记录的大小去判断是否需要全表扫描 一般数据量 占 全表的5 -20 是会优先考虑索引的 如果数据量太大 他会全表扫描