求助:SQL查询优化

表结构分别为:
create table TMP_TB2033
(
  REL_INSUR_CLM_THRD VARCHAR2(20),
  COVER_ID           VARCHAR2(10),
  POLICY_NO          VARCHAR2(30),
  PRODUCT_ID         VARCHAR2(20),
  CASE_REG_NO        VARCHAR2(20),
  COVER_CLAIM_NO     VARCHAR2(20),
  COMPANY_NO         VARCHAR2(20),
  CREATE_SYSTEM_ID   VARCHAR2(10)
);
create index IND_TMP_TB2033_1 on TMP_TB2033 (COVER_CLAIM_NO, COMPANY_NO);

create table TB2033
(
  INSUR_CLAIM_ID        CHAR(20) not null,
  SEQ_NO                NUMBER not null,
  COVER_CLAIM_NO        VARCHAR2(30),
  COMPANY_NO            VARCHAR2(30),
  COVER_CLAIM_STAT      VARCHAR2(30),
  COVER_CLAIM_STAT_DATE DATE,
  TOT_PAID              NUMBER(16,2),
  TOT_PAID_CRNCY        CHAR(10),
  COVER_CLAIM_AMT       NUMBER(16,2),
  COVER_CLAIM_AMT_CRNCY CHAR(10) default '1070010001',
  COVER_CLAIM_DESC      VARCHAR2(900),
  COVER_ID              VARCHAR2(15),
  REL_INSUR_CLM_THRD    CHAR(20),
  CASE_REG_DATE         DATE,
  COVER_TYPE            CHAR(10),
  POLICY_NO             VARCHAR2(45),
  PRODUCT_ID            VARCHAR2(30),
  CLAIM_SEQ             NUMBER,
  EXT_EVE_REF           VARCHAR2(45),
  EXT_SYSTEM_ID         CHAR(10),
  CREATED_TS            TIMESTAMP(6) not null,
  UPDATED_TS            TIMESTAMP(6) not null,
  CREATE_SYSTEM_ID      CHAR(10) not null,
  UPDATE_SYSTEM_ID      CHAR(10) not null,
  SRC_CRTD_TS           TIMESTAMP(6),
  SRC_UPTD_TS           TIMESTAMP(6),
  BRANCH_ID             VARCHAR2(20)
);
alter table TB2033
  add primary key (INSUR_CLAIM_ID);
create unique index IND_2033_1 on TB2033 (INSUR_CLAIM_ID);
create index IND_2033_2 on TB2033 (COVER_CLAIM_NO, COMPANY_NO);
create index IND_2033_3 on TB2033 (REL_INSUR_CLM_THRD)

查询语句为:
SELECT
A.COVER_CLAIM_NO,A.COMPANY_NO,A.INSUR_CLAIM_ID,A.SEQ_NO, TO_CHAR(A.SRC_CRTD_TS,'YYYY-MM-DD HH24:MI:SS') SRC_CRTD_TS
FROM
TB2033 A, TMP_TB2033 B
WHERE A.CREATE_SYSTEM_ID='0300530005'
AND B.CREATE_SYSTEM_ID='0300530005'
AND A.COVER_CLAIM_NO=B.COVER_CLAIM_NO
AND A.COMPANY_NO=B.COMPANY_NO

求助:怎么样才能用到索引啊?TMP_TB2033的索引可以修改
我也来说两句 查看全部回复

最新回复

  • mylife920 (2008-6-27 21:38:37)

    组合索引where语句得执行应该是从右-左,如果是这种顺序,where 得最后一个条件写
    A.COVER_CLAIM_NO=B.COVER_CLAIM_NO;不知道我说得是否正确,请大家回复!
  • valenwon (2008-6-28 14:56:56)

    mylife920 顺序对cost优化器的选择已经没有影响了

    pepsirjl 你应该贴出执行计划
    然后告诉大家,你希望用 那个索引 ,而却没有用到
    能告诉大概的数据量,哪个是驱动表就更好了
  • pepsirjl (2008-6-30 09:46:14)

    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------------------------

    --------------------------------------------------------------------
    | Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
    --------------------------------------------------------------------
    |   0 | SELECT STATEMENT     |             |   203 | 18879 |   477 |
    |*  1 |  HASH JOIN           |             |   203 | 18879 |   477 |
    |*  2 |   TABLE ACCESS FULL  | TMP_TB2033  |   405 | 12555 |    49 |
    |*  3 |   TABLE ACCESS FULL  | TB2033      | 39596 |  2397K|   426 |
    --------------------------------------------------------------------

    Predicate Information (identified by operation id):

    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------------------------
    ---------------------------------------------------

       1 - access("A"."COVER_CLAIM_NO"="B"."COVER_CLAIM_NO" AND
                  "A"."COMPANY_NO"="B"."COMPANY_NO")
       2 - filter("B"."CREATE_SYSTEM_ID"='0300530005')
       3 - filter("A"."CREATE_SYSTEM_ID"='0300530005')
    大家帮我看看,现在为什么两个表用的是全表扫描,谢谢
  • valenwon (2008-6-30 20:19:32)

    你现在的计划是 HJ JOIN
    B 表被hash 到内存中,然后scan A 表做比较
    AND A.COVER_CLAIM_NO=B.COVER_CLAIM_NO
    AND A.COMPANY_NO=B.COMPANY_NO
    被用于做probe了
    只有A.CREATE_SYSTEM_ID='0300530005'
    用于做数据扫描
    所以你利用不到IND_2033_2 on TB2033 (COVER_CLAIM_NO, COMPANY_NO);
  • pepsirjl (2008-7-01 17:09:53)

    好的,谢谢楼上的,太感谢了