一张表,主键 YSFYB_ID ,三个索引 DYXSXXBID  ,SFXMDMB_ID,DYXSXXB 
SQL> desc ysfyb 
Name      Type          
---------- ------------- 
YSFYB_ID  NUMBER                  
NDMB_ID    NUMBER                  
XQDMB_ID  NUMBER                  
DYXSXXBID  NUMBER                  
SFXMDMB_ID NUMBER                
DYXSXXB    VARCHAR2(20)  sql语句1: 
select * from ysfyb where sfxmdmb_id in (1,2,3) and dyxsxxb in ('aa','bb') and dyxsxxbid in (1,2,3,4,5,6....)  使用了索引扫描 sql语句2: 
select * from ysfyb where sfxmdmb_id in (1,2,3) and dyxsxxb in ('aa','bb') and dyxsxxbid in (select xsid from aa where zydmb_id=1 and xbdmb_id=1) 
索引失效,没有用索引查询 请问如何修改 sql语句2 在可以通过子查询的情况下使用索引查询 刚才提问有朋友建议用 exists ,但是试了一下以为可以,但结果还是不行,但是帖子不小心被我结了,重复一个帖子,希望高人指点一二

解决方案 »

  1.   

    1.你的这两个查询最后分别返回多少记录?
    2.ysfyb表一共有多少记录?
    3.aa表上建的有索引吗?
      

  2.   

    刚才我给你的。只是有可能效率比in高些。
    你再aa表
    zydmb_id,xbdmb_id,xsid
    这三个字段有没有建索引呢。再这三个字段加过后,再用我给的语句
      

  3.   

    回一楼的朋友
    1.sql1直接列出id数据多,没有列很多,sql2直接用子查询,所以sql2语句肯定比sql1语句结果多的多
    2.ysfyb中有5641136条数据
    3.aa中没有建索引后面分析表后执行发现其实sql1,sql2都有用到索引,下面贴出执行图
      

  4.   

    由于不会贴图,不好意思,直接写个执行结果吧
    sql 1 用到了索引
    INDEX RANGE SCAN IND_YSFYB_DYXSXXBID
    sql 2 用到了索引
    TABLE ACCESS FULL AAA
    INDEX RANGE SCAN IND_YSFYB_DYXSXXBID由于 aaa没有建索引,所以是全表扫描,但是问题是我建了3个索引,现在只用了一个dyxsxxbid,为什么其他两个没有用到
      

  5.   

    你建联合索引试试。
    (sfxmdmb_id,dyxsxxb,dyxsxxbid)
      

  6.   

    像你这个查询在一个表上当然只会使用一个索引,难道还会同时使用多个索引?一个表上存在多个平级索引时,你用的CBO,ORACLE计算出用IND_YSFYB_DYXSXXBID成本最低,所以用这个索引,而不是用另外两个索引中的某一个。解决方法就是建联合索引,不过你说建立联合索引不方便是什么意思,哪里不方便呢?你的查询条件不固定在这3个列上吗?