select a.* from talbe1 a
       where instr(a.col1,(select b.col2 from b,c where b.recno = c.brecno and b.col4= 'R23' and rownum < 2 ) > 0 )
该语句怎么样利建立索引来优化,或者别的办法?,(主要是table1表的查询优化(怎样用上索引?) )

解决方案 »

  1.   

    -- Just FYI:
    SELECT *
      FROM TALBEL A
     WHERE EXISTS
     (SELECT 1
              FROM b
             WHERE EXISTS (SELECT 1 FROM B.RECNO = C.BRECNO AND B.COL4 = 'R23')
               AND INSTR(A.COL1, B.COL2) > 0);
      

  2.   

    每个表数据都是上10万的
    a {
      recno ,col1(存放b中col1的值,如果有多个用,分开),col2,col3
    }
    其实不止这些列
       arecno01 ,[b2,b22],a3
    ....
    b{
       recno ,col1,col2,col3
    }
    其实不止这些列
      brecno01,b2,e,w
      brecno02,b22,s,f
      brecno03 ,b222,d,s
    ....c{
       recno ,col1(对应b中的recno),col2,col3
       crecno01 ,brecno01,w,r
        crecno02 ,brecno01,q,
        rcrecno03,brecno02,q,rw
    }
    其实不止这些列
      

  3.   


    每个表数据都是上10万的 
    a { 
      recno ,col1(存放b中col1的值,如果有多个用,分开),col2,col3 

    其实不止这些列 
      arecno01 ,[b2,b22],a3 
    .... 
    b{ 
      recno ,col1,col2,col3 

    其实不止这些列 
      brecno01,b2,e,w 
      brecno02,b22,s,f 
      brecno03 ,b222,d,s 
    .... c{ 
      recno ,col1(对应b中的recno),col2,col3 
      crecno01 ,brecno01,w,r 
        crecno02 ,brecno01,q, 
        rcrecno03,brecno02,q,rw 

    其实不止这些列 select a.* from talbe1 a 
          where instr(a.col1,(select b.col1 from b,c where b.recno = c.brecno and b.col4= 'R23' and rownum < 2 ) > 0 ) 
      

  4.   

    更正一下:语句如下:
    select a.* from  a 
          where instr(a.col1,(select c.recno from b,c where b.recno = c.brecno and b.col3= 'R23' and rownum < 2 ) > 0 ) 
    说明:每个表数据都是上10万的 
    至于表的结构 ,有很多列,但是我用到的过滤条件的列就象我所描述的,就是我要查找a中的数据,但是我现在只知道b的col3的值(比如象我所说的:R23),根据这个值和等值连接(和c表b.recno = c.brecno)查找到c中的c.recno的值,多条记录的话只要一条即可(rownum < 2);如果c.recno的值存在a.col1中(instr(a.col1,c.recno) > 0 )则把a表记录取出来
     
    a { 
      recno ,col1(存放c中col1的值,如果有多个用,分开),col2,col3 (recno,col1,col2,col3都是varchar2型 ,recno(主键),col1,col2,col3都是列名)

    其实不止这些列 
      arecno01 ,[crecno01,crecno02],a3  ,e 
      arecno02 ,rcrecno03,a3   ,g
    .... 
    b{ 
      recno ,col1,col2,col3   (recno(主键),col1,col2,col3都是varchar2型   recno,col1,col2,col3都是列名)

    其实不止这些列 
      brecno01,b2,e,w 
      brecno02,b22,s,f 
      brecno03 ,b222,d,R23 
    .... c{ 
      recno ,col1(对应b中的recno),col2,col3 
      crecno01 ,brecno01,w,r 
        crecno02 ,brecno01,q, 
        rcrecno03,brecno02,q,rw 

    其实不止这些列 (recno(主键),col1(对应b中的recno),col2,col3都是varchar2型   recno,col1,col2,col3都是列名)
      

  5.   

    加上索引注释 /*+index(TABLE INDEX_NAME)*/ 查询下适合快速查询的索引,强制索引,看下效果怎么样!
      

  6.   

    exists之类的关键字的适用性也是有要求的,理论上应该是一个数据集大的和一个数据集小的,也就是业务数据表和字典表之间来使用。两端都是业务数据表的条件下效率本身就不会高。
    而且你还用了一些oracle的内置函数,那就效率就更难说了,不要认为oracle自己提供的内置函数就一切Ok,根本不是这样的,函数的运行本身也是需要资源和转换时间的。我就遇到过多表关联查询时,where子句中to_char转换date型字段为字符串,然后跟参数比对的情况,数据量超过60万(我遇到的),查询速度就突然变慢。将对字段的to_char去掉,修改为对参数的to_date处理后,查询速度就特别快了。