본문 바로가기

튜닝

[Tuning] perfect_study_04 Part 5. Cartesian Product Cartesian Product는 다음과 같은 조인을 수행할 때 발생한다. ① WHERE절 없는 조인 수행 ② 조인을 위한 조건 없이 조인 수행 Cartesian Product는 "데이터 복제" 라는 개념을 활용하기 위해 사용하게 된다. 그러나 잘못 사용하는 경우에는 오히려 데이터를 부풀리는 원인이 되기 때문에 퍼포먼스를 오히려 나쁘게 할 수도 있다. Part 5 에서는 Cartesian Product를 적용해야 할 대상을 사례별로 다루어 봄으로써, Cartesian Product를 정확하게 사용할 수 있도록 하고자 한다. [사례연구 #12] Cartesian Product의 응용Ⅰ * Cartesian Product를 응용한 대표적인 사례 ☞ ① FROM .. 더보기
[Tuning] perfect_study_03 [사례연구 #08] Sub-query로 Join해결 * Join과 Sub-query를 성능상 비교 대상이 될 수 있다. 기본적으로 테이블에 대한 데이터 처리를 join에서 할 때와 sub-query 에서 할 때를 서로 비교함으로써 상대적으로 적게 데이터를 처리할 수 있도록 하는 방법을 선택할 수 있어야 한다. - Correlated Sub-query와 Nested Sub-query 사용을 통해서 조인에 대한 튜닝을 하고자 함. ① Correlated sub-query의 실행원리 항상 main-query가 먼저 실행되며, 이때 데이터가 추출되는 가운데 sub-query가 반복해서 실행된다. ② Nested sub-query의 실행원리 일반적으로 sub-query가 먼저 실행되며, 그 후에 main-quer.. 더보기
[Tuning] perfect_study_02 ★★ Oracle의 Hint → Optimizer에게 작업방법을 알려줄 수 있는 수단임. 따라서 힌트를 사용하게 되면 대부분 힌트에 의해서 optimizer는 작업을 하게 됨. (SQL 튜닝이 쉬워짐) 한편, 힌트를 갖고 있는 SQL의 실행계획은 고정됨. (힌트의 문제점) ㈜ 사용법 - Hint의 영향력은 hint를 갖고 있는 SQL에 한정됨 - 하나의 SQL은 배타적인 관계에 해당하는 hint가 아니라면 개수에 제한없이 hint를 사용할 수 있음 - Hint는 syntax 에러가 없음 - /* + hint */ 또는 -- + 와 같이 "*" 와 "+" 사이에 또는 "-" 와 "+" 사이에 빈칸이 있어선 안됨 - Hint에 의해서 테이블을 지칭할 때, 테이블에 대해서 alias를 사용 중이라면 hint도.. 더보기
[Tuning] 분석함수의 활용 (셀프조인의 해결) 분석함수의 활용 (셀프조인의 해결) 사용자가 요구하는 리포트의 특성 또는 테이블의 설계적인 특성 으로 인한 Self-Join 상의 과부하적인 부분을 해소할 수 있는 방안이 있습니다. 특히 이번 예제에서는 Self-Outer Join에 대 해 사용할 수 있는 분석용 함수를 알아 보고자 합니다. - 인덱스정보 DANGA_HIST_PK : CODE + SEQ_NO (Self-Join이면서 아우터 조인 형태) SELECT A.CODE, A.SEQ_NO, A.PRICE, A.BEGIN_YMD, NVL(B.BEGIN_YMD,'99991231') END_YMD FROM DANGA_HIST A, DANGA_HIST B WHERE A.CODE = B.CODE(+) AND A.SEQ_NO + 1 = B.SEQ_NO(+);.. 더보기
[Tuning] 분석함수의 활용 (셀프조인의 해결) Analytic Functions 의 활용 -> 셀프 조인의 해결 #1 Original Source -- View Merge 현상 발생 SELECT C.BRNCOD, C.CMPID, C.STSDAT, C.STS, C.AMT FROM CUSTOMER C, /* 최종상태*/ (SELECT B.BRNCOD, B.CMPID, B.STSDAT, MAX(B.STS) MAX_STS FROM CUSTOMER B, /* 최종날짜 */ (SELECT BRNCOD, CMPID, MAX(STSDAT) MAX_DAT FROM CUSTOMER WHERE STSDAT 0 call count cpu elapsed disk query current rows ------- ------ -------- ---------- --------.. 더보기
[Tuning] Scalar 서브쿼리 활용 [개요] Sub-query 는 조인과 더불어 자주 사용되고 있습니다. 특히, 아우터 조인과 똑같은 결과를 만들어 내기 위한 방안으로 1) PL/SQL을 이용한 사용자 정의 함수(User defined function)의 사용 2) Scalar Sub-query의 사용 등을 고려할 수 있습니다. 이번 예제에서 는 이러한 두 가지 방안의 내부적 수행원리를 비교해 보도록 하겠습니다. 기본정보 Rule Based Optimizer EC_COURSE : EC_COURSE_PK : COURSE_CODE EC_COURSE_SQ : EC_COURSE_SQ_PK : COURSE_CODE + YEAR + COURSE_SQ_NO EC_COURSE_SQ_IDX_01 : YEAR (Non Unique) 0. Before Tun.. 더보기
[Tuning] Nested와 Correlated Sub-query의 동시 사용 [사례연구] Nested와 Correlated Sub-query의 동시 사용 本 사례에서는 요구사항의 특성으로 인해 SQL 의 WHERE 절에 IN과 EXISTS를 동시에 사용할 수 밖에 없는 경우, 이를 효과적으로 처리 할 수 있는 방안을 찾고자 한다. - 요구사항 전체 과정(COURSE_CODE)에 대하여 2000년에 신청자가 전혀 없거나 500 명 미만인 과정에 대해 과정코드와 과정명을 조회하고자 합니다. 전제조건 Rule Based Optimzer EC_COURSE : EC_COURSE_PK : COURSE_CODE EC_APPLY : EC_APPLY_PK : COURSE_CODE + YEAR + COURSE_SQ_NO + MEMBER_TYPE + MEMBER_ID Before Tuning SEL.. 더보기
[Tuning] 서브쿼리를 통한 튜닝 기본조건 Rule Based Optimizer EC_COURSE : EC_COURSE_PK : COURSE_CODE EC_APPLY : EC_APPLY_PK : COURSE_CODE + YEAR + COURSE_SQ_NO + MEMBER_TYPE + MEMBER_ID 0. Before Tuning SELECT A.COURSE_CODE, A.COURSE_NAME FROM EC_APPLY B, EC_COURSE A WHERE A.COURSE_CODE = B.COURSE_CODE(+) AND B.YEAR(+) = '2000' GROUP BY A.COURSE_CODE, A.COURSE_NAME HAVING COUNT(B.COURSE_CODE) > 0 call count cpu elapsed disk query .. 더보기
[Tuning] 인덱스에 의한 Sort 대체 인덱스에 의한 Sort 대체 ▶ Index 정보 - 인덱스정보 EC_COURSE : EC_COURSE_PK : COURSE_CODE EC_COURSE_SQ : EC_COURSE_SQ_PK : COURSE_CODE + YEAR + COURSE_SQ_NO EC_COURSE_SQ_IDX_01 : YEAR (Non Unique) EC_APPLY : EC_APPLY_PK : COURSE_CODE + YEAR + COURSE_SQ_NO + MEMBER_TYPE + MEMBER_ID EC_APPLY_COMPANY_IDX : COMPANY_NO (Non Unique) ++ 테이블 중 EC_COURSE_SQ 테이블만 통계정보 존재 ▶ Before Tuning SELECT B.COURSE_CODE, C.COURSE_NAM.. 더보기
[Tuning] 인덱스 매칭률 인덱스 매칭률 특정 테이블에 대해서 SQL 상의 주어진 조건으로 인해 사용될 수 있는 인덱스가 두 개 이상이라고 할 때 Optimizer는 조건에 가장 적절한 인덱스를 선택해서 사용해야 한다. 이와 같이 주어진 조건에 가장 적절한 인덱스를 선택해서 사용하고자 할 때 이용하는 원리이자 기준을 "인덱스 매칭률"이라고 한다. 인덱스 매칭률 = WHERE 절에서 1st컬럼 부터 연속된 컬럼에 대해 상수화 된 조건에 '='을 사용한 컬럼의 개수 / 인덱스를 구성하는 컬럼의 총 개수 Optimizer의 인덱스 선택 시 판단 절차 1) 주어진 조건에 대한 각 인덱스 별로 매칭률을 계산하여 매칭률이 높은 것을 우선적으로 선택 2) 인덱스 별 매칭률이 같을 경우 인덱스를 구성하는 컬럼의 개수가 많은 것을 우선적으로 선택.. 더보기