表:
CREATE TABLE TABLE1
(
    KEIYUID                        CHAR(16) NOT NULL,
    KOTEINO                        CHAR(10) NOT NULL,
    KBN                            CHAR(3) NOT NULL,
    SETUBAN                        NUMBER(3,0) NOT NULL,
    KTYP                           CHAR(1) NOT NULL,
    CONSTRAINT PK_TABLE1 PRIMARY KEY (KOTEINO, SETUBAN)
)
索引:
CREATE INDEX TABLE1_INDEX4
ON DES_UPKEI
(KOTEINO, KBN)

CREATE INDEX TABLE1_INDEX5
ON DES_UPKEI
(KOTEINO, SETUBAN, KBN)因为表和索引都是原先的人建好的,现在拿过来用而已
看了执行计划,发现第一个语句没用索引
再次谢谢各位!

解决方案 »

  1.   

    1.SELECT KOTEINO,SETUBAN,KBN FROM TABLE1 WHERE KOTEINO = 123 AND KBN = 4这条语句的查询出来的结果集有多少?占总数据的多少?你的优化器是什么模式?
      

  2.   

    我记得好像按照索引顺序才有效。1.KOTEINO,SETUBAN,KBN 第一个的条件没有按照这个顺序所以不使用索引
      

  3.   

    SELECT KOTEINO,SETUBAN,KBN FROM TABLE1 WHERE KOTEINO = 123 AND KBN = 4改成SELECT KOTEINO,SETUBAN,KBN FROM TABLE1 WHERE KOTEINO = '123' AND KBN = '4' 再试试看
      

  4.   

    或许有可能是你第一条的结果集实在太大。因为在这种情况下优化器是会走FTS的。建议你先给表作个分析analyze table tablename compute statistics
      

  5.   

    Oracle不是每次都走索引扫描,比如表比较小的时候或者筛选的结果占百分比比较大的时候,oracle都是走全表扫描,因为程序经过判断后可能会认为全表扫描更快.但oracle的判断不是每次都准确,如果碰到了走全表扫描耗时非常大的时候,可以强制指定走索引扫描.
    /*****************************************
    已经有两个索引:
        1.KOTEINO,SETUBAN,KBN
        2.KOTEINO,KBN现有两个查询语句:
      1.SELECT KOTEINO,SETUBAN,KBN FROM TABLE1 WHERE KOTEINO = 123 AND KBN = 4
      2.SELECT KOTEINO,SETUBAN,KBN FROM TABLE1 
                   WHERE KOTEINO = 123 AND SETUBAN = 2 AND KBN = 4 
    *****************************************/例如索引1名字为idx_1,索引2名字为idx_2查询可以这样写:
    1:
    SELECT /*+ index(a idx_2) */ KOTEINO,SETUBAN,KBN FROM TABLE1 a
    WHERE KOTEINO = 123 AND KBN = 4
    2.
    SELECT /*+ index_ffs(a idx_1) */ KOTEINO,SETUBAN,KBN FROM TABLE1 a       
    WHERE KOTEINO = 123 AND SETUBAN = 2 AND KBN = 4 语句1表示强制走索引扫描,先扫描索引再扫描表,这样加快速度.
    语句2表示只走快速索引扫描,而不扫描表,由于select的三个字段都在索引中,所以只扫描索引而不扫描表,速度更快.
    注意:并非Oracle每次的选择都是最优的,并非任何时候索引扫描都比全表扫描快.