创建一个表:
create table substr_0402(
id number primary key,
count number);插入一些数据;如: insert into substr_0402 values(1,1555);执行下面sql语句:select * from substr_0402 where substr(count,2,3)=555;如何优化这条语句?
一个面试题,请解答!谢谢!

解决方案 »

  1.   

    select * from substr_0402 where count.substring(2,3)=555; 
      

  2.   

    建立一个基于函数的索引,
    CREATE INDEX IDX_FUN ON SUBSTR_0402(substr(TO_CHAR(count),2,3));
    查询时用到这个索引:select * from substr_0402 where substr(TO_CHAR(count),2,3)=555; 
      

  3.   


    我试了不行,提示无效的?
    我用的是oracle92
      

  4.   

    楼上们不要教错的啊,晕哦.oracle哪里有substring函数啊.楼主也是,既然要用substr,为什么要定义为number类型呢?所以,你应该:truncate table substr_0402;
    alter table substr_0402 modify count varchar2(10);
    insert into substr_0402 values(1,1555);
    .....SQL>  select * from substr_0402;        ID COUNT
    ---------- ----------
             1 1555
             2 11
             3 11
             4 11
             5 11
             6 11
             7 11
             9 11
            29 11
           293 11
          2932 11        ID COUNT
    ---------- ----------
         29332 11已选择12行。SQL>SQL> select * from substr_0402 where substr(count,2,3)=555;        ID COUNT
    ---------- ----------
             1 1555
    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   TABLE ACCESS (FULL) OF 'SUBSTR_0402'
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
             19  consistent gets
              0  physical reads
              0  redo size
            455  bytes sent via SQL*Net to client
            503  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processedSQL> create index i_fun_count on substr_0402(substr(count,2,3));索引已创建。SQL> exec dbms_stats.gather_table_stats(ownname=>'A',tabname=>'SUBSTR_0402',casc
    ade=>true);
    PL/SQL 过程已成功完成。SQL> select * from substr_0402 where substr(count,2,3)=555;        ID COUNT
    ---------- ----------
             1 1555Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=26 Bytes=208)
       1    0   TABLE ACCESS (BY INDEX ROWID) OF 'SUBSTR_0402' (Cost=2 Car
              d=26 Bytes=208)   2    1     INDEX (RANGE SCAN) OF 'I_FUN_COUNT' (NON-UNIQUE) (Cost=1
               Card=26)Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              4  consistent gets
              0  physical reads
              0  redo size
            455  bytes sent via SQL*Net to client
            503  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed