2016-09-07 5 views
0

매우 커질 가능성이있는 테이블에서 정기적으로 여러 번 실행되는 쿼리가 있습니다. 빨리 쿼리를 처리 할 수있는 인덱스를 갖고 싶습니다. 나는 인덱스에 익숙하지 않다하지만 지금까지 내가 가진 다음 쿼리 및 인덱스 :오라클 - 특정 쿼리와 일치하는 테이블 인덱스를 만드는 방법은 무엇입니까?

update PERMISSION 
SET EXPIRED_FLAG=1 
where CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END =1 
    AND CURRENT_FLAG=1 
    AND SYSDATE+SUBSTR(TO_CHAR(SYSTIMESTAMP, 'TZR'),2,2)/24> VAL_START+30/1400 
    AND EXPIRED_FLAG=0; 

내 인덱스 보이는 같은 :

CREATE INDEX NDX_VAL_DB_CLOSE ON PERMISSION 
(CURRENT_FLAG, CASE WHEN VAL_END IS NULL THEN 1 ELSE 0 END, CASE WHEN EXPIRED_FLAG=0 THEN EXPIRED_FLAG END) 
PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
     ) 
LOGGING 
LOCAL ( 
    PARTITION NDX_VAL_FKTICKET_ID_PRT1 
    LOGGING 
    NOCOMPRESS 
    TABLESPACE IDX_PRT_01 
    PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      FREELISTS  1 
      FREELIST GROUPS 1 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ), 
    PARTITION NDX_VAL_FKTICKET_ID_PRT2 
    LOGGING 
    NOCOMPRESS 
    TABLESPACE IDX_PRT_02 
    PCTFREE 10 
    INITRANS 2 
    MAXTRANS 255 
    STORAGE (
      INITIAL   1M 
      NEXT    1M 
      MAXSIZE   UNLIMITED 
      MINEXTENTS  1 
      MAXEXTENTS  UNLIMITED 
      PCTINCREASE  0 
      FREELISTS  1 
      FREELIST GROUPS 1 
      BUFFER_POOL  DEFAULT 
      FLASH_CACHE  DEFAULT 
      CELL_FLASH_CACHE DEFAULT 
      ) 
) 
NOPARALLEL; 

실행 계획 :

enter image description here

I 내 색인이 실제로 검색어와 일치하는지 파악하고 싶습니다. 실행 계획을 살펴보면 내 인덱스가 사용되고있는 것으로 보이지만 인덱스 조건이 의미가 있으며 업데이트 쿼리와 완전히 일치하는지 100 % 확신하지 못했습니다. 인덱스에 실제로 수행하여 쿼리와 일치 시키거나 인덱싱 된 모든 열을 이미 사용하고 있습니까? (다시, 나는 완전히 색인 생성에 익숙하지 않으며 이것은 분할 된 테이블이므로 약간 분실 됨)

+0

다양한 조건부가 얼마나 선택적입니까? 내 생각에 다양한 1/0 술어는 특별히 선택적인 것이 아니며 'val_start'는 쿼리에서 유일하게 합리적으로 선택적인 술어입니다. 즉,'val_start' 술어가 실질적으로 업데이트해야하는 행 수를 줄이고 다른 술어는 많이 수행하지 않는다고 생각합니다. 하지만 그건 내가 추측 한 것입니다. 당신은 당신의 데이터를 압니다. 테이블은 어떻게 파티셔닝됩니까? –

+0

이 표에서 대부분의 항목은 만료 된 플래그 = 1을 가지며 일부만 선택하면 = 0이되고 적은 경우가 30 분을 넘지 않게됩니다. 현재 플래그에 파티션에 관해서는, 너무 익숙하지 않은 프로세스에 의해 제어되지만 시간이지나면서 더 많은 항목이 추가되면 현재의 0 대신 현재의 두 번째 파티션으로 이동되는 항목이 더 많이 추가됩니다. = 1 내가 관심있는 활성 파티션에서. –

+0

실제 쿼리는 여기 있습니다.이 인덱스는 업데이트 쿼리의 컨텍스트를 고려하여 표시되고 실제로 표시된 업데이트 쿼리에서 사용되는 모든 매개 변수 (조건 자)입니다. –

답변

0

색인 대신 색인 (NDX_VAL_DB_CLOSE) 대신 다른 색인 (NDX_PTP_DB_CLOSE)을 사용하는 것처럼 보입니다. 올바른 인덱스로 Oracle 옵티 마이저 힌트를 사용하십시오. 쿼리를 다시 구성하지 않는 경우

+0

고마워, 네 말이 맞아, 내 부분에 오타가 있었어. 인덱스가 실제로 NDX_VAL_DB_CLOSE를 사용하고있다. (PTP 버전과 동일하다. 이름을 바꿨다.) –