SQL NOT EXISTS 관련 속도개선 질문입니다. 0 4 6,875

by 용현DBA [2009.06.03 16:55:00]


안녕하세요.. NOT EXISTS 관련 쿼리에서 너무 많은 지연시간을 갖는 쿼리부분이 있어 질문 올리겠습니다.

고수님들의 많은 도움 바라겠습니다.

 

다음은 문제의 쿼리입니다.

쿼리의 목적은 감지데이터에서 처리데이터를 걸러낸 건수 즉, 감지미처리 건수를 구하고자 하는 것입니다.

----------------------------------------------------------------------------------------

SELECT  COUNT(*) CNT
    FROM TCSR_SENSING t1
WHERE PLID=’097’
       AND KMDT BETWEEN ’20090602’ AND ’20090603’
       AND KMBH LIKE ’%’||’%’
       AND NOT EXISTS ( SELECT ’X’
                                               FROM TCSR_HANDLE t2
                                           WHERE t1.plid = t2.plid
                                                  AND t1.kmdt = t2.kmdt
                                                  AND t1.kmbh = t2.kmbh
                                                  AND t1.gjbh = t2.gjbh )

       AND JJHJ=’0’;

----------------------------------------------------------------------------------------

TCSR_SENSING(감지테이블) 27만건 정도이고, TCSR_HANDLE(처리테이블) 26만여건 입니다.

컬럼설명 :

1) TCSR_SENSING :

PLID (영업소고유번호) PK, KMDT (근무날짜) PK, KMBH (근무번호) PK , GJBH(감지일련번호) PK,

JJHJ (전진후진) : 0 (전진), 1(후진)

2) TCSR_HANDLE :

PLID (영업소고유번호) PK, KMDT (근무날짜) PK, KMBH (근무번호) PK,

JJHJ (전진후진) : 0 (전진), 1(후진)

※ TCSR_HANDLE 테이블에서는 GJBH(감지일련번호)가 PK가 아닙니다.

(TCSR_HANDLE 테이블 내의 GJBH 컬럼은 UNIQUE한 형태이며 UNIQUE 키 또는 인덱스를 걸어둘까 했지만.. 해당 테이블에는 이미 너무 많은 인덱스가 걸려있어.. 오히려

속도지연이 예상되는바 인덱스가 아닌 다른 방안을 고민중입니다.)

 

많은 조언 부탁드리겠습니다.

by 마농 [2009.06.03 17:27:11]
SELECT COUNT(*) cnt
FROM tcsr_sensing t1
, tcsr_handle t2
WHERE t1.plid = '097'
AND t1.kmdt BETWEEN '20090602' AND '20090603'
AND t1.kmbh LIKE '%'||'%'
AND t1.jjhj = '0'
AND t1.plid = t2.plid(+)
AND t1.kmdt = t2.kmdt(+)
AND t1.kmbh = t2.kmbh(+)
AND t1.gjbh = t2.gjbh(+)
AND t2.plid IS NULL
;

by 용현DBA [2009.06.04 17:44:27]
우선... 임시방편으로.. gjbh 컬럼에 인덱스를 걸어서 속도는 개선시켰습니다.

그런데... 마농님 답변은 감사하지만... 쿼리튜닝하신걸로 돌려봐도...
수행속도는 뭐... 거의 똑같네요.. ㅎㅎ ;;

오히려... 위에 있는 쿼리가... 약 60만 여건 식 되는 데이터를 검색했을경우..
살짝 더 빠르네요.. ^^;

by 마농 [2009.06.04 17:54:20]
그럼 이건 얼마나 걸리나요?
SELECT COUNT(*)
FROM
(
SELECT plid, kmdt, kmbh, gjbh
FROM tcsr_sensing t1
WHERE plid = '097'
AND kmdt BETWEEN '20090602' AND '20090603'
AND kmbh LIKE '%'||'%'
AND jjhj = '0'
MINUS
SELECT plid, kmdt, kmbh, gjbh
FROM tcsr_handle t2
)
;

by 마농 [2009.06.04 17:56:46]
아, 그리고 인덱스를 추가해서 얼마나 향상되었나요?
인덱스 추가하시는 것이 임시방편이 아닌 옳은 방법이라 생각되는데요.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입