database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38629 게시물 읽기
No. 38629
쿼리 튜닝 부탁드립니다. 아님 방도라도..ㅠㅠ
작성자
무심도
작성일
2011-06-22 19:23
조회수
5,120

 

어설프게 튜닝 시도 하다 망했습니다..ㅠㅠ

아무리 해도 시간이 단축 되질 않아요.

백만건 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)

[Top]
No.
제목
작성자
작성일
조회
38632팩되어 있는 자료를 언팩시켜서 조회하는 방법 알려주시면 고맙겠습니다. [3]
진윤제
2011-06-23
3727
38631고수님들 도와주세요~!! [1]
조현욱
2011-06-23
3617
38630간단한것 같은데 잘 모르겠네요 도움좀 부탁드립니다. [4]
나그네
2011-06-22
4370
38629쿼리 튜닝 부탁드립니다. 아님 방도라도..ㅠㅠ
무심도
2011-06-22
5120
38628고수님들 쿼리질문입니다. [1]
쫑~~
2011-06-22
4352
38627[오라클] 전체 백업 후 복구실패 [1]
zark
2011-06-22
4362
38626char 조회조건 잘 되지 않습니다. [3]
열심히
2011-06-21
3580
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다