现 在 数 据 库 中 有 这 样 几 个 表1 DJUSN 
  主 键:EMPCD,JYMD,HPCD,CSCD
  数 据 量:30000件
2 DDATA
  主 键:EMPCD,JYMD,HPCD,ITEMCD,YOUSO
  数 据 量:300000件
3 MCSIT
  主 键:ITEMCD,CSCD
  数 据 量:200件各 表 都 有 主 键 索 引有 下 面 两 个 SQL 语 句
语 句1
SELECT
    DJUSN.EMPCD,
    DJUSN.CSCD,
    DJUSN.HPCD,
    DJUSN.JYMD,
    DJUSN.TRGTYM,
    DJUSN.RVNO
FROM
    DJUSN
WHERE
    DJUSN.JYMD  like '2008%'  AND
    EXISTS (SELECT
                C.ITEMCD
            FROM
                MCSIT C ,
                DDATA D
            WHERE
                C.DDELF = '0' AND
                D.EMPCD(+) = DJUSN.EMPCD  AND
                D.JYMD(+) = DJUSN.JYMD  AND
                D.HPCD(+) = DJUSN.HPCD AND
                C.CSCD = DJUSN.CSCD AND
                C.ITEMCD = D.ITEMCD(+) AND
                 (D.ITEMCD IS NULL OR D.MOTOKBN IS NULL)
            )
ORDER BY
    DJUSN.EMPCD
语 句 2
SELECT
    DJUSN.EMPCD,
    DJUSN.CSCD,
    DJUSN.HPCD,
    DJUSN.JYMD,
    DJUSN.TRGTYM,
    DJUSN.RVNO
FROM
    DJUSN
WHERE
    DJUSN.TRGTYM  LIKE '2008%'  AND
    EXISTS (SELECT
                C.ITEMCD
            FROM
                MCSIT C ,
                DDATA D
            WHERE
                C.DDELF = '0' AND
                D.EMPCD(+) = DJUSN.EMPCD  AND
                D.JYMD(+) = DJUSN.JYMD  AND
                D.HPCD(+) = DJUSN.HPCD AND
                C.CSCD = DJUSN.CSCD AND
                C.ITEMCD = D.ITEMCD(+) AND
                 (D.ITEMCD IS NULL OR D.MOTOKBN IS NULL)
            )
ORDER BY
    DJUSN.EMPCD
语 句 1 执 行 时 间 小 于 1 秒,语 句 2 需 要 1 分 钟
我 试 图 通 过 增 加 一 个 索 引 提 高 语 句 2 的 执 行 速 度,但 是 实 际 结 果 是 速 度没 有 任 何 提 高
CREATE INDEX DJUSN_TRGTYM_IDX ON DJUSN(EMPCD,JYMD,HPCD,CSCD,TRGTYM)是 不 是 因 为 TRGTYM 不 是 主 键 的 原 因,有 什 么 办 法 来 提 高 语 句 2 的 执 行 速度。
(不 能 修 改 语 句 2)

解决方案 »

  1.   

    在 DJUSN.TRGTYM 列上建立索引。
      

  2.   

    单独在 DJUSN.TRGTYM 列上建立索引。CREATE INDEX DJUSN_TRGTYM_IDX ON DJUSN(TRGTYM)
      

  3.   

    CREATE INDEX DJUSN_TRGTYM_IDX ON DJUSN(TRGTYM,EMPCD,JYMD,HPCD,CSCD)
      

  4.   

    1. 两句就差在TRGTYM LIKE '2008%'和JYMD like '2008%'上,所以在TRGTYM 建索引要好些,但如果TRGTYM列满足条件的结果很多,那系统也不会走索引.
    2. 一般在多表连接列上建复合索引.
      

  5.   

    CREATE INDEX DJUSN_TRGTYM_IDX ON DJUSN(TRGTYM)
    CREATE INDEX DJUSN_TRGTYM_IDX ON DJUSN(TRGTYM,EMPCD,JYMD,HPCD,CSCD)两种方法都不管用。上面有个地方说的不对,DDATA 表现在没有主键,但是有索引
    (EMPCD,JYMD,HPCD,ITEMCD,YOUSO)两条语句满足条件的记录都是10件
      

  6.   

    两个语句都是对LIKE的结果全标扫描
    速度的快慢就看LIKE后的数据量了
    你看一下TRGTYM LIKE '2008%'和JYMD like '2008%'的各自数据
    还有用LIKE查询是不走索引得
      

  7.   

    如果LIKE不走索引,那么JYMD like '2008%'同样也没有走,因该是没有区别的啊。问题又没有可能出在与DDATA表的外连接上?                D.EMPCD(+) = DJUSN.EMPCD  AND
                    D.JYMD(+) = DJUSN.JYMD  AND
                    D.HPCD(+) = DJUSN.HPCD AND