어설프게 튜닝 시도 하다 망했습니다..ㅠㅠ
아무리 해도 시간이 단축 되질 않아요.
백만건 select insert 하는데 한시간 반이 걸리네요.
이거 어떻게 튜닝 해야 할까요?
SELECT /*+ LEADING (A B I C G) */
B.활동_ID, -- 캠페인ID
A.고객_ID, -- 고객번호
A.채널, -- 발송채널코드
B.그룹_유형, -- 캠페인그룹유형코드
B.그룹_ID, -- 캠페인그룹ID
B.기획_ID, -- 프로모션ID
B.시작일, -- 캠페인시작일자
B.종료일, -- 캠페인종료일자
DECODE(A.고객_분류,'2','CG001'||B.활동_분류||DECODE(B.테스트_유무,'Y','T','R')||'01', 'PG001'||B.활동_분류||DECODE(B.테스트_유무,'Y','T','R')||'01'), -- 세그ID
DECODE(A.고객_분류,'2','N', 'Y'), -- PG 구분
A.고객군_ID, -- 고객군ID
A.전송일, -- 채널전송일자
A.발송일, -- 채널발송일자
DECODE(A.고객_분류,'2','Z0006', B.서비스), -- 서비스코드
B.서비스_유형, -- 서비스유형코드
DECODE(B.삭제_여부 ,'P999' , 'N' ,'Y') ,-- 클린징여부
DECODE(A.고객_분류 ,'3','Y','N') , -- 발송고객필수여부
SUBSTRB(TRIM(G.고객명),1,30), -- 고객명
G.고객ID, -- 고객주민번호
NVL(TRIM(G.이동사업자번호_자택) || TRIM( G.이동국번_자택) || TRIM(G.이동전화번호_자택),TRIM(G.이동사업자번호_직장) || TRIM( G.이동국번_직장) || TRIM(G.이동전화번호_직장)), -- 고객이동번호
(SELECT 이름 FROM 공통 WHERE CDM_TY = '5023' AND 코드 = B.번호), -- 수신번호
G.메일ID, -- 고객이메일
NVL(DECODE(G.청구지고객주소구분코드개인신용,
'002',TRIM(G.우편번호_자택),
'001',TRIM(G.우편번호_직장)),' ') AS ADDRESS1 , -- 청구지 우편번호
NVL(DECODE(G.청구지고객주소구분코드개인신용,
'002',TRIM(G.광역시도명_자택) ||' ' || TRIM(G.시군구명_자택) ||' ' || TRIM(G.읍면동명_자택),
'001',TRIM(G.광역시도명_직장) ||' ' || TRIM(G.시군구명_직장) ||' ' || TRIM(G.읍면동명_직장)),' ') AS ADDRESS1 , -- 청구지주소1
NVL(DECODE(G.청구지고객주소구분코드개인신용,
'002',TRIM(G.자택주소_2),
'001',TRIM(G.직장주소_2)),' ') AS ADDRESS2 , -- 청구지주소2
NVL(DECODE(G.청구지고객주소구분코드개인신용,
'002','',
'001',TRIM(G.직장명)),' ') AS COMP_NAME ,-- 회사명
NVL(DECODE(G.청구지고객주소구분코드개인신용,
'002','',
'001',SUBSTRB(TRIM(G.부서명),1,22)),' ') AS DEPT_NAME ,-- 직장명
G.청구지고객주소구분코드개인신용, -- 청구지고객주소구분코드개인신용
I.컨텐츠_ID, -- 컨텐츠ID
RPAD(NVL(CASE WHEN G.웹멤버회원여부 = 'Y' THEN
TO_CHAR(TO_DATE(G.웹멤버쉽가입일자,'YYYYMMDD'),'YYYY-MM-DD') ||' 웹회원가입시'
ELSE TO_CHAR(TO_DATE(G.동의서등록일자,'YYYYMMDD'),'YYYY-MM-DD') ||' 입회시'
END,' '), 100, ' ') AS AGREE , -- 메일수신동의내용
G.잔여포인트_6대 AS POINT , -- 잔여포인트
NVL(DECODE(B.입금_여부, 'Y', B.입금일자, 'N', '00010101'),'00010101'), -- 입금일자 (입금일자 없을시 0001-01-01로 고정함)
B.구분_코드, -- 대상자구분코드
C.ADD_INFO_01, -- TEMP01
C.ADD_INFO_02, -- TEMP02
C.ADD_INFO_03, -- TEMP03
C.ADD_INFO_04, -- TEMP04
C.ADD_INFO_05, -- TEMP05
C.ADD_INFO_06, -- TEMP06
C.ADD_INFO_07, -- TEMP07
C.ADD_INFO_08, -- TEMP08
C.ADD_INFO_09, -- TEMP09
C.ADD_INFO_10, -- TEMP10
C.ADD_INFO_11, -- TEMP11
C.ADD_INFO_12, -- TEMP12
C.ADD_INFO_13, -- TEMP13
C.ADD_INFO_14, -- TEMP14
C.ADD_INFO_15, -- TEMP15
B.CAMP_DRFT_EMP,
TO_DATE(B.CAMP_DRFT_DT,'YYYYMMDD')
FROM
(
SELECT /*+ LEADING(A B) USE_HASH(A)*/
A.고객군_ID, A.실활동_ID, A.채널, A.전송일, A.발송일,
B.고객_ID, B.고객_분류
FROM (SELECT 채널, 실활동_ID, 전송일, 발송일, 고객군_ID
FROM 수행_활동 -- 60건 정도
WHERE 전송일 = '20110615'
AND 채널 = '03'
AND EX_ACT_CHK_YN = 'Y'
)A,
고객_리스트 B -- 사백만건
WHERE A.고객군_ID = B.고객군_ID
) A,
(SELECT /*+ LEADING(A B C D) */
A.실활동_ID, A.활동_ID, A.기획_ID, A.활동_분류, A.CAMP_DRFT_EMP, A.CAMP_DRFT_DT,
B.그룹_유형, B.테스트_유무, B.삭제_여부, B.그룹_ID, B.구분_코드,
C.시작일, C.종료일,
D.서비스, D.입금_여부, D.번호, D.서비스_유형, D.입금일자
FROM C_EX_CAMP A, C_PLAN_GRP B, C_PLAN C, C_PLAN_SVC_INFO D
WHERE SYSDATE BETWEEN EX_시작일 AND EX_종료일
AND A.EX_CAMP_STAT IN ('1300','2200','3100')
AND B.구분_코드 = '1'
AND A.그룹_ID = B.그룹_ID
AND A.활동_ID = C.활동_ID
AND A.활동_ID = D.활동_ID
) B ,
고객-부가정보 C, -- 천오백만건
컨텐츠_관리 I, -- 이백건
고객_일 G -- 천오백만건
WHERE A.실활동_ID = B.실활동_ID
AND A.실활동_ID = I.CMP_ID
AND B.활동_ID = I.CMP_ID
AND A.채널 = I.CHNL_C
AND A.고객군_ID = C.고객군_ID(+)
AND A.고객_ID = C.고객_ID(+)
AND A.채널 = C.채널(+)
AND A.고객_ID = G.고객번호
밑에는..플랜입니다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=25 Card=1 Bytes=692)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_CD_MNG' (TABLE) (Cost=3 Card=1 Bytes=22)
2 1 INDEX (RANGE SCAN) OF 'ECUBE.C_CD_MNG_PK' (INDEX (UNIQUE)) (Cost=2 Card=1)
3 0 NESTED LOOPS (OUTER) (Cost=25 Card=1 Bytes=692)
4 3 NESTED LOOPS (Cost=23 Card=1 Bytes=628)
5 4 NESTED LOOPS (Cost=22 Card=1 Bytes=230)
6 5 NESTED LOOPS (Cost=21 Card=1 Bytes=177)
7 6 NESTED LOOPS (Cost=15 Card=7 Bytes=1K)
8 7 NESTED LOOPS (Cost=13 Card=9 Bytes=1K)
9 8 NESTED LOOPS (Cost=12 Card=12 Bytes=1K)
10 9 TABLE ACCESS (FULL) OF 'ECUBE.C_EX_CAMP' (TABLE) (Cost=11 Card=1 Bytes=83)
11 9 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_PLAN_GRP' (TABLE) (Cost=1 Card=1 Bytes=22)
12 11 INDEX (UNIQUE SCAN) OF 'ECUBE.SYS_C006052' (INDEX (UNIQUE)) (Cost=0 Card=1)
13 8 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_PLAN' (TABLE) (Cost=1 Card=1 Bytes=24)
14 13 INDEX (UNIQUE SCAN) OF 'ECUBE.SYS_C006462' (INDEX (UNIQUE)) (Cost=0 Card=1)
15 7 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_PLAN_SVC_INFO' (TABLE) (Cost=2 Card=1 Bytes=28)
16 15 INDEX (RANGE SCAN) OF 'ECUBE.SYS_C006477' (INDEX (UNIQUE)) (Cost=1 Card=1)
17 6 TABLE ACCESS (BY INDEX ROWID) OF 'PMUCH.IF_CTTS_MG' (TABLE) (Cost=6 Card=1 Bytes=20)
18 17 INDEX (RANGE SCAN) OF 'PMUCH.IF_CTTS_MG_PK' (INDEX (UNIQUE)) (Cost=1 Card=1)
19 5 VIEW (Cost=1 Card=1 Bytes=53)
20 19 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_CUST_LIST' (TABLE) (Cost=0 Card=519K Bytes=11M)
21 20 NESTED LOOPS (Cost=25 Card=10M Bytes=586M)
22 21 TABLE ACCESS (FULL) OF 'ECUBE.C_EX_ACT' (TABLE) (Cost=25 Card=19 Bytes=779)
23 21 INDEX (RANGE SCAN) OF 'ECUBE.C_CUST_LIST_IDX01' (INDEX) (Cost=0 Card=519K)
24 4 TABLE ACCESS (BY INDEX ROWID) OF 'PMUCH.MUCH_FTCM_CST_PSNL_D' (TABLE) (Cost=1 Card=1 Bytes=398)
25 24 INDEX (UNIQUE SCAN) OF 'PMUCH.MUCH_FTCM_CST_PSNL_D_PK' (INDEX (UNIQUE)) (Cost=0 Card=1)
26 3 TABLE ACCESS (BY INDEX ROWID) OF 'ECUBE.C_PER_INFO' (TABLE) (Cost=2 Card=1 Bytes=64)
27 26 INDEX (UNIQUE SCAN) OF 'ECUBE.SYS_C006045' (INDEX (UNIQUE)) (Cost=1 Card=1) |