sql语句和执行计划:(注:sql语句不能改)select * from arap_djfb fb where FB.DWBM = '1006' AND FB.WLDX = 0 AND FB.DEPTID IS NOT NULL AND FB.DR = 0 AND FB.XGBH <> 1 AND FB.VERIFYFINISHEDDATE >= '2010-07-02' AND FB.BILLDATE < '2010-07-02';
943876 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 3096075778-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 10481 | 7482K| 127K (5)| 00:25:25 |
|* 1 | TABLE ACCESS FULL| ARAP_DJFB | 10481 | 7482K| 127K (5)| 00:25:25 |
-------------------------------------------------------------------------------Predicate Information (identified by operation id):
---------------------------------------------------  1 - filter("FB"."DWBM"='1006' AND "FB"."WLDX"=0 AND "FB"."DEPTID" IS
  NOT NULL AND "FB"."DR"=0 AND "FB"."XGBH"<>1 AND
  "FB"."VERIFYFINISHEDDATE">='2010-07-02' AND
  "FB"."BILLDATE"<'2010-07-02')
Statistics
----------------------------------------------------------
  34 recursive calls
  0 db block gets
  615573 consistent gets
  258778 physical reads
  0 redo size
  341010671 bytes sent via SQL*Net to client
  692644 bytes received via SQL*Net from client
  62927 SQL*Net roundtrips to/from client
  1 sorts (memory)
  0 sorts (disk)
  943876 rows processed
注释:
1、 表中 总共有500W条数据
2、FB.DWBM = '1006' 中DWBM 一共有两个值 '1001'和'1006' ;1001 400W条 1006 100W条
3、WLDX 有两个值 0 和1
4、DR 有两个值 0 和1 大部分是0
5、XGBH 有三个值-1,0,1
6、VERIFYFINISHEDDATE 是日期,每天大概 1000-2000条数据
7、BILLDATE 基本同上 可能 值略有不同。
请给位高手 指点一下如何建立索引。

解决方案 »

  1.   

    VERIFYFINISHEDDATE 可以考虑建个索引试试
      

  2.   

    谢谢了,目前用的 oracle 不是企业版 没法用那些高级功能,企业版好像要 十几万吧
      

  3.   

    刚才又看了一下 VERIFYFINISHEDDATE  只有一个值 '3000-01-01' 汗
    如果 BILLDATE < '2010-07-02' ,是不是 就没有 优化的可能了?
      

  4.   

    刚在 DWBM  上加了个索引,查询用时20s,目前只能如此了
    tangren 没有给太多分的原因 是 BILLDATE 上建索引是没有用的