建立了一个表E_MP_DAY_READ,大约有200万的记录数
create table E_MP_DAY_READ
(
  id        NUMBER(16) not null,
  data_date DATE not null,
  col_time  DATE not null,
  pap_r     NUMBER(11,4),
  pap_r1    NUMBER(11,4)

也建立了索引
create index IDX_E_MP_DAY_READ_DATA on E_MP_DAY_READ (DATA_DATE)
  tablespace SCND
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );
create index IDX_E_MP_DAY_READ_ID on E_MP_DAY_READ (ID)
  tablespace SCND
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );但 SELECT * FROM E_MP_DAY_READ E WHERE E.DATA_DATE= to_date('2013-05-25','yyyy-MM-dd') 时,PL/SQL的解释计划中,还显示 
SELECT STATEMENT, GOAL = ALL_ROWS 23 808 53328 23
 TABLE ACCESS FULL E_MP_DAY_READ 23 808 53328 23 1
还是在全表扫描 ,求高手指点!
Oracle索引

解决方案 »

  1.   

    1.看下 这个语句查询的记录数占总数的多少?
    SELECT count(1) FROM E_MP_DAY_READ E ;
    SELECT count(1) FROM E_MP_DAY_READ E WHERE E.DATA_DATE= to_date('2013-05-25','yyyy-MM-dd');2.如果占的比例不高,还不走索引,那就如楼上所说,分析下表
    BEGIN
      EXEC dbms_stats.gather_table_stats(ownname          => 'TEST',
                                         tabname          => 'E_MP_DAY_READ',
                                         cascade          => TRUE);
    END;
      

  2.   

    索引损坏了,重新建索引。
    必须先删除原来的索引
    drop index IDX_E_MP_DAY_READ_DATA 
    在重新创建索引
    create index IDX_E_MP_DAY_READ_DATA on E_MP_DAY_READ (DATA_DATE)
      tablespace SCND
      pctfree 10
      initrans 2
      maxtrans 255
      storage
      (
        initial 64K
        minextents 1
        maxextents unlimited
      );
      

  3.   

    重新分析下这个表吧,重新统计信息
    analyze table E_MP_DAY_READ compute statistics;