EXISTS 카운트 속도 문의 (재문의라 할수 있네요) 1 1 1,170

by 레브레카 [2014.12.23 18:05:09]


아래에는 명시안했지만 테이블1을 제외하고는 링크 테이블입니다.

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

SELECT COUNT(*)

FROM 테이블1 A, 테이블2@링크명 B, 테이블3@링크명 C

WHERE 조건

AND  EXISTS (SELECT 1 FROM 테이블4@링크명 WHERE 컬럼 = A.컬럼)

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

1분 30초 이상 걸리고, EXISTS 안의 조건은 테이블4의 PK 컬럼입니다.

테이블4에는 PK를 제외한 인덱스는 없습니다.

실행계획에는 FILTER 처리되었습니다.

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

동일

AND A.컬럼 IN (SELECT 컬럼 FROM 테이블4@링크명)

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

6초 걸렸고, EXISTS 결과와 동일합니다.

실행계획에 FILTER는 처리되어 있지 않고, HASH JOIN은 동일하나 테이블4가 VIEW로 처리되었습니다.

 

EQUL 조인으로 하면

5초 걸리기는 하나 EXISTS와 IN 결과보다 카운트가 높게 나와버립니다.

 

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

SELECT COUNT(*)

FROM 테이블1 A, 테이블2@링크명 B, 테이블3@링크명 C, 테이블4@링크명 D

WHERE 1=1

AND A.컬럼 = B.컬럼

AND B.컬럼 = '특정값'

AND A.컬럼 = C.컬럼

AND A.컬럼 = D.컬럼

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

문의드리고 싶은 것은 다음 두가지 입니다.

IN 보다는 EXISTS가 성능이 무조건 좋은 것은 아닌게 맞나요?

EQUAL 조인으로 동일한 결과를 얻을 수 있는 것 아니었나요?

by 마농 [2014.12.23 18:17:27]

1. IN 보다는 EXISTS가 성능이 무조건 좋은 것은 아닌게 맞나요?
  - 겉으로 보이는 쿼리구문이 아닌, 속으로 돌아가는 실행계획에 의해 성능이 좌우됩니다.
2. EQUAL 조인으로 동일한 결과를 얻을 수 있는 것 아니었나요?
  - 메인과 서브의 관계가 1 : 1 관계였다면 동일했겠지요?
  - 1 : m 관계라면 건수가 늘어나게 됩니다.
  - m 을 Group By 하여 1로 만들어 조인하는 방법도 있습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입