실행계획을 보다가 비트맵 연산자가 떴길래 질문드립니다. 도움말을 봐도 알쏭달쏭하네요.. 첨부파일로 실행계획 올렸구요.
쿼리는 아래와 같습니다.
SELECT B.S_SMSYN
FROM SM_POS_DB.DBO.CLIENT_T A
INNER JOIN #TMPCLIENTS B
ON A.CREDIT_CARD_NO = B.S_BCNUM
WHERE A.SMS_YN <> B.S_SMSYN
제가 해석한 바는
1.6번라인에서 임시테이블인 #TMPCLIENTS 를 풀스캔합니다. 결과행은 217013건 . 병렬로 8개의 쓰레드로 실행되었고 , 캡쳐에는 없지만
쓰레드별로 24000~37000 정도 ROW가 불규칙하게 분포하고 있습니다.
2.5번라인에서 리파티션을 거치면서 8개의 쓰레드에서 27000정도의 균일한 분포로 쓰레드별 ROW가 재분배됩니다.
3.여기부터가 애매한데요. 4번라인에서 비트맵연산자를 거치면서 Bitmap1005가 정의됩니다.
4.8번라인에서 총데이터 건수 230만건인 CLIENT_T 을 스캔하는데 막상 row수는 대략 30만건정도만 검색되어 나왔습니다. 실행계획의
WHERE 절을 보면
WHERE:(PROBE([Bitmap1005],[SM_POS_DB].[dbo].[CLIENT_T].[CREDIT_CARD_NO] as [A].[CREDIT_CARD_NO])))
이렇게 있는데요. 제가 해석한 바에 따르면 쓰레드별로 스캔을 하되 빌드인풋으로 메모리에 있는 Bitmap1005 값과 CLIENT_T 의
CREDIT_CARD_NO 값과 비교를 하는데 ,확실하게 조인대상이 아닌행만 필터링으로 분리해내는듯 합니다.
#TMPCLIENTS 와 CLIENT_T 는 키값을 기준으로 거의 1:1이기 때문에 정확한 비교가 되었다면 217013과 근접한 값이 나왔어야 겠죠.
쓰레드별로 35000~45000 정도 ROW 검색됩니다.
5.7번라인에서 리파티션을 거치면서 쓰레드당 약 38000건정도의 균일한 분포로 쓰레드별 ROW가 재분배됩니다.
6.3번라인에서 보이듯 대망의 해쉬조인 , 그리고 게더스트림으로 쓰레드별로 있는 값 합치기..
이름이 BITMAP인것으로 보아 비트연산을 통해서 기다,아니다 판단되는게 아닌가 합니다. 실행계획보는게 어설퍼서 맘대로 해석해봤는데요. 잘못된점이나 참고삼아야할점 있으면 지적 부탁드립니다.
Comment 1
-
이재학_302349
2013.06.11 15:56
대략 맞는거 같네요. 오라클쪽에 스타 변형 조인이라고 보시면 될 겁니다.