最近遇到一个SQL语句效率的问题,实在不知如何解决,请大家帮忙看看,谢谢了。用的是Oracle10g + TOAD。原语句:SELECT * FROM table 
         WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND
       column_3 > 333333.33 AND column_4 < 444444.44column_1,column_2,column_3,column_4 都已建了index,但都不是UNIQUE的。table中有一列 column_0 是建有 UNIQUE INDEX的。问题是,现在这个查询语句需要大概10分钟来运行,有没有什么更快的实现方法?

解决方案 »

  1.   

    加上ORDER BY column_1,column_2,column_3,column_4 看看
      

  2.   

    你这个语句应该没有用到index,你查看看执行计划.
      

  3.   

    column_1,column_2,column_3,column_4 将这4个字段建立一个组合索引
      

  4.   

    楼主试试建立colunm_1、column_2、column_3、colmun_4的联合索引(假设索引名为idx1),修改一下SQL
    select /*+index(tablename,idx1)*/ * from tablename
    WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND 
          column_3 > 333333.33 AND column_4 < 444444.44;
      

  5.   

    1,建立联合索引;
    2,找一个选择性最高的索引使用;
    3,使用所有的索引SELECT /*+ index_combine(table index_1,index_2,index_3,index_4)*/* FROM table 
            WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND 
          column_3 > 333333.33 AND column_4 < 444444.44 
      

  6.   

    建立了索引不一定代表会使用的。
    你用的是'>'和'<'这2个操作符合都不会使用索引的。这样看看
    SELECT * FROM table 
            WHERE (case when column_1 > 111111.11,1,else 0 end ) +(case when column_2 < 222222.22,1,else 0 end ) +(case when column_3 > 333333.33,1,else 0 end ) +(case when column_4 < 444444.44,1,else 0 end ) =4
      

  7.   

       恩!建个组合索引就行了!
      create index indexname on table(column_1,column_2,column_3,column_4);
      

  8.   


    试过了,这个方法大概需要7-8分钟,有了1-2分钟的进步。谢谢啦!不知道还有没有更好的建议呢?回答大家几个问题:
      这个table已经建了组合索引(column_1,column_2,column_3,column_4)。
      其中的数据量大概有50000000。感谢大家的建议,希望能看到更多更好的建议!谢谢。
      

  9.   


    执行计划如下:PLAN_TABLE_OUTPUT
    Plan hash value: 1357647378
     
    --------------------------------------------------------------------------------------
    | Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |                  |   307K|    20M| 96130   (4)| 00:19:14 |
    |*  1 |  TABLE ACCESS FULL| table      |   307K|    20M| 96130   (4)| 00:19:14 |
    --------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter("column_4"<444444.44 AND "column_1">111111.11 AND "column_2"<222222.22 
                  AND "column_3">333333.33)
      

  10.   

    |*  1 |  TABLE ACCESS FULL| table     |  307K|    20M| 96130  (4)| 00:19:14 | 
    .............5kw的数据量,分区不知道行不行。。
      

  11.   


    谢谢你的建议,分区的话需要企业级的Oracle,我们这个标准版是不能分区的 :)