2014-10-30 2 views
0

내가 프로 시저 안에 다음 삭제 문이 : 천천히 약 10 초입니다오라클 - 작은 테이블에 천천히 문을 삭제

delete t_excuse 
    where EMP_NO = AL_EMPNO 
    AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G; 

합니다.

하지만 같은 선택 조항을 추가하면 삭제가 실행되므로 빠릅니다. LS_STARTDATE_G 간의

select count(*) 
into v_avariable from t_excuse 
     where EMP_NO = AL_EMPNO 
     AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G; 

delete t_excuse 
     where EMP_NO = AL_EMPNO 
     AND TO_CHAR(EXCUSE_DATE,'yyyymmdd') BETWEEN LS_STARTDATE_G AND LS_ENDDATE_G; 
+1

t_excuse에 트리거가 정의되어 있습니까? 모든 색인? 인덱스가 삭제 될 때 업데이트되고 삭제 트리거가 실행됩니다. 둘 다 select 문에서 발생하지 않으므로 성능 차이에 대한 설명이 될 수 있습니다. –

+0

트리거가 없지만 pk 컬럼의 기본 인덱스 –

+0

전체 데이터 모델에서 모든 외래 키의 인덱스를 확인하십시오. 누락 된 항목이 있으면 작성하십시오. – nop77svk

답변

0

TO_CHAR (EXCUSE_DATE, 'YYYYMMDD')과 LS_ENDDATE_G

dateliteral을 비교하는? implicit conversion을 피하십시오. 열의 데이터 유형이 DATE 인 경우 날짜 열을 사용하십시오 (TO_CHAR). 원하는 형식으로 표시하려면 TO_DATE을 사용하십시오. 당신이 EXCUSE_DATE 컬럼에 인덱스가있는 경우

delete t_excuse 
    where EMP_NO = AL_EMPNO 
    AND EXCUSE_DATE BETWEEN to_date(LS_STARTDATE_G,'yyyymmdd') 
         AND to_date(LS_ENDDATE_G,'yyyymmdd'); 

, 그럼 이제 오라클은 index을 사용합니다. 새 조회로 Explain 플랜을 점검하십시오.

EDIT 실제로 시간 부분을 없애려면 TRUNC을 사용하십시오. 그러나, 그것은 INDEX 사용을 억제 할 것입니다. 색인을 TRUNC(EXCUSE_DATE)으로 만들어야합니다.

+0

날짜도 있기 때문에 나는 time 부분을 없애기 위해 to_char에 열을 변환하고있다. –

+0

그런 다음'TRUNC'을 사용하고'TRUNC (EXCUSE_DATE)'로'함수 기반 인덱스 '를 만든다. –

+0

이전에 시도한 함수 기반 인덱스 to_char (excuse_date, 'yyyymmdd')와 동일하게 사용됩니다 –