日期:2014-05-17  浏览次数:21009 次

查询条件中含有IN为什么不使用索引?
我有下面的一个SQL语句,在FRAME表上根据ID、SUBSTATION_ID和CONTAINER_ID分别建立的索引。但是查看这个语句的执行计划,不管是外层的那个FRAME还是内层的那个FRAME使用的都是全表扫描,而没有使用索引。但是如果in后面跟的是( '1234 ', '2345 ')   这样的形式却会使用ID建立的索引。大家帮忙分析一下,看是什么原因造成的吗?我查过了,表中建立索引的字段数据类型是一致的,不存在需要转换的字段

SELECT   DECODE(C.USE_STATUS, '1 ', '空闲 ', '2 ', '占用 ', '3 ', '预占 ')   AS   状态,COUNT(C.ID)   AS   CNT  
    FROM   CONNECTOR   C,  
              FRAME   D  
    WHERE   C.CABLE_DEVICE_ID   =   D.ID  
        AND   D.COL_ROW   =   '横 '  
        AND   D.CONTAINER_ID   IN  
                (   SELECT   DISTINCT   A.CONTAINER_ID  
                        FROM   FRAME   A,  
                                  BLOCK   B  
                        WHERE   A.ID   =   B.MDF_FRAME_ID  
                            AND   A.SUBSTATION_ID   IN   (SELECT   DISTINCT   ID   FROM   SUBSTATION   WHERE   STD_CODE   LIKE   '2101% ')
                            AND   A.COL_ROW   =   '直 '  
                            AND   B.EXCH_CODE   =     '2251 '    
                )  
        AND   C.SERIAL_FAULT   =   '1 '  
        AND   C.RES_TYPE   =   '5 '  
    GROUP   BY   C.USE_STATUS

------解决方案--------------------
CBO的分析结果可能认为全表扫描更快,重建表的统计信息试下,
如果不行,就用hint,强制用索引即可。
------解决方案--------------------
把IN用Exists子句改写。执行计划可能会用nested loop
------解决方案--------------------
把in改成exists,