4.DECODE 함수를 이용한 IF 처리의 효율화

Slides:



Advertisements
Similar presentations
널 (null) 의 처리 널을 검색하는 방법 형식 예 ) takes 테이블에서 아직 학점이 부여되지 않은 학생의 학번을 검색 is null is not null ( 질의 64) select stu_id from takes where grade is null.
Advertisements

G202G202 G201G201.
제6장 조건문.
Chapter 04 SQL 고급.
SQL Statement Tuning e-Architecture 팀 임성욱.
19.(코드+년도+월)별,(코드)별,전체총액을 한번에
SQL 0613.
오라클 데이터베이스 성능 튜닝.
Prepared Statements CSED421: Database Systems Labs.
Perfect! 대용량 데이터베이스 튜닝Ⅱ.
12 프로젝트 실습.
실전 데이터모델링 & 데이터베이스 설계와 구축
SAP QUERY SAP R/3 4.6C.
질의어와 SQL 기본 SQL 고급 SQL 데이타의 수정 데이타 정의 언어 내장 SQL
대용량 데이터베이스 솔루션 발표자: 박보영 2007년 5월19일.
오라클 데이터베이스 성능 튜닝.
박시우 ( 업무에 바로 쓰는 SQL 튜닝 박시우 (
Execution Plan의 수립 결과 SQL OPTIMIZER SQL해석 실행 계획 실행 수립 참조 참조 추출
4장. 관계 대수와 SQL SQL 관계 데이터 모델에서 지원되는 두 가지 정형적인 언어
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
SQL 개요 SQL 개요 - SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나
Toad for Oracle 설치 방법.
오라클 데이터베이스 성능 튜닝.
오라클 데이터베이스 성능 튜닝.
롯데마트 CRM 데이터 분석 교육 2014년 12월 > RE::VISION 전용준 리비젼컨설팅 대표
제2절 법인세의 계산구조와 세무조정 1. 각 사업연도소득에 대한 법인세 계산구조 회계와 사회 결산서상 당기순이익
데이터 베이스 설계 및 실습 #3 - SQL 함수.
롯데마트 CRM 데이터 분석 교육 2014년 12월 > RE::VISION 전용준 리비젼컨설팅 대표
SQL 함수 SQL 함수.
Chapter 05 데이터베이스 프로그래밍.
6장. 물리적 데이터베이스 설계 물리적 데이터베이스 설계
차례 튜닝 - 프로필러를 이용한 튜닝 프로필러 친해지기 프로필러 결과 테이블로 만들기 프로필러 결과 분석하기
14 뷰(View) 뷰의 개념 뷰 관리.
제 17 장 (Oracle) 오라클에서 질의 최적화
뷰와 저장 프로시저 뷰의 개념을 이해한다. 뷰의 정의와 관리 방법을 이해한다. 뷰를 사용함으로써 생기는 장점을 알아본다.
SELECT empno, ename, job, sal, dname FROM emp, dept
16장. 테이블의 변경 새로운 행 삽입 테이블에서 테이블로 행을 복사 행 값의 변경 테이블에서 행 삭제
DP-ORA 쿼리 최적화 가이드 쿼리 최적화 방법 2014년 7월.
강사: 이종인 다우 교육원 전임강사 / 온디멘드 수석 컨설턴트 / FMG 수석 컨설턴트
SQL Server 7.0 세미나 (Performance Tuning)
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
다양한 예제로 쉽게 배우는 오라클 SQL 과 PL/SQL
목 차 들어가기 ………… 2 작동원리 ………… 4 구문설명 ………… 6 FUNCTIONS …………11 예제 ………… 2
Windows 환경에서 동작하는 Arm Emulator(Simulator)
1장. SELECT 문장을 이용하여 원하는 데이터 가져오기
JSP 게시판 구현.
데이터베이스 (Database) SQL 추가 기능: 주장, 뷰, 프로그래밍 기법 문양세 강원대학교 IT대학 컴퓨터과학전공.
자전거를 배우려면 안장에 올라가 페달을 밟아라.
EBSCO KOREA.
Database 중고차 매매 DB 비즈니스IT 윤동섭.
Microsoft Office Specialist
11장. GROUP BY와 HAVING 열의 그룹화 2개 이상의 열에 대한 그룹화
SQL Tuning.
문양세 (1st version: 문성우) (revised by 손시운)
SQL INJECTION MADE BY 김 현중.
06. SQL 명지대학교 ICT 융합대학 김정호.
객체지향 패러다임에서의 코드 재사용을 위한 응집도 레벨 식별 모범 사례
고객님! 장수시대 필수 상품 준비하셨나요? 간 병 보 험 무배당 무배당 상품특징!! ~3등급 2 구분
이용자 가이드 2012 EBSCO Korea.
How I Approach Tuning a SQL Statement
2015년 2학년 1반.
Stored program 2 장종원
Stored program 장종원
차세대 뱅킹시스템 프로젝트의 DBMS 튜닝 이슈 극복 사례
8단계 3층을 완성한다 Case 1 Case 2 Case 3 Case 4
쿼리 활용하기 1 담당교수 : 박흠 실용컴퓨터 데이터베이스 기초 Access 담당교수 박흠.
EBSCO KOREA.
사원 조직 본사 본부 부서 팀 사원 조립규칙 부품 부품
Automotive Consumer Trends 2002 ~ 2006
Presentation transcript:

4.DECODE 함수를 이용한 IF 처리의 효율화 인덱스정보 EC_EXAM_APPLY_PK : COURSE_CODE + YEAR + COURSE_SQ_NO + EXAM_NO + MEMBER_TYPE + MEMBER_ID SQL SQL#04_01 IF RESULT < 10 THEN 'A' ELSE IF RESULT < 20 THEN 'B' ELSE IF RESULT < 30 THEN 'C' ELSE IF RESULT < 40 THEN 'D' ELSE IF RESULT < 50 THEN 'E' ELSE IF RESULT < 60 THEN 'F' ELSE IF RESULT < 70 THEN 'G' ELSE IF RESULT < 80 THEN 'H' ELSE IF RESULT < 90 THEN 'I' ELSE 'J' END IF SELECT YEAR, DECODE(SIGN(RESULT - 10),-1,'A', DECODE(SIGN(RESULT - 20),-1,'B', DECODE(SIGN(RESULT - 30),-1,'C', DECODE(SIGN(RESULT - 40),-1,'D', DECODE(SIGN(RESULT - 50),-1,'E', DECODE(SIGN(RESULT - 60),-1,'F', DECODE(SIGN(RESULT - 70),-1,'G', DECODE(SIGN(RESULT - 80),-1,'H', DECODE(SIGN(RESULT - 90),-1,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(SIGN(RESULT - 90),-1,'I','J'))))))))); [개요] DECODE 함수는 오라클에만 적용할 수 있는 함수로 'IF ... THEN ... ELSE' 에 해당하는 기능을 갖고 있습니다. 그런데 현실적으로 다양한 요구사항에 대한 표현에 있어 제약사항이 많이 있다는 것이 문제라 할 수 있습니다. DECODE 함수의 제약사항에 의해 발생할 수 있는 이러한 문제들은 V8.1.x 부터는 CASE 함수를 사용할 수 있어서 쉽게 처리할 수 있게 되었습니다. 그러나 과거 부터 구축되어 있는 응용시스템(Applications)의 경우는 대다 수의 SQL을 살펴보면 DECODE 함수를 사용을 하고 있고, CASE 함수를 사용 할 수 있는 버전을 사용하고 있는 경우도 대다수의 개발자가 이미 DECODE 함수에 익숙해져 있음으로 인해 아직도 이를 사용하고 있는 것이 현상이라 할 수 있겠습니다. 따라서 本 사례에서는 DECODE 함수를 이용한 IF 처리를 하고자 할 때 어 떻게 하면 보다 더 효율적으로 사용할 수 있는지를 찾아 보고자 합니다.

4.DECODE 함수를 이용한 IF 처리의 효율화 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY' . EC_EXAM_APPLY 점수 별 DECODE(SIGN(연산),…, DECODE(…))…) 처리 GROUP BY 1차가공 2차가공 504056

4.DECODE 함수를 이용한 IF 처리의 효율화 문제점 DECODE(…) 문장에서 DECODE() 내에 있는 점수 별 데이터 처리는 추출된 데이터 마다 즉, Row 단위로 수행되고 있으며 특히 다양한 ELSE 부분 처리를 위해서 너 무 많은 DECODE 함수를 사용하고 있습니다. 문제점을 해결하기 위한 방안 DECODE(…) 문장에서 DECODE() 내에 있는 점수 별 데이터 처리는 GROUP BY를 활용 함으로써 전반적으로 내부적인 수행횟수를 감소 시킬 수 있으며 특히 다양한 ELSE 부분 처리를 위해서 사용한 DECODE 함수의 사용 개수를 줄일 수 있도록 해야 합니다.

4.DECODE 함수를 이용한 IF 처리의 효율화 FLOOR 함수를 사용한 SQL SQL#04_02 SELECT YEAR, DECODE(FLOOR(RESULT/10), 0,'A', DECODE(FLOOR(RESULT/20), 0,'B', DECODE(FLOOR(RESULT/30), 0,'C', DECODE(FLOOR(RESULT/40), 0,'D', DECODE(FLOOR(RESULT/50), 0,'E', DECODE(FLOOR(RESULT/60), 0,'F', DECODE(FLOOR(RESULT/70), 0,'G', DECODE(FLOOR(RESULT/80), 0,'H', DECODE(FLOOR(RESULT/90), 0,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(FLOOR(RESULT/90), 0,'I','J'))))))))); FLOOR 함수는 절삭 된 값을 Return 합니다. - RESULT < 10 인 경우 : FLOOR(RESULT/10) → 0 - 10 <= RESULT < 20 인 경우 : FLOOR(RESULT/20) → 0 - 20 <= RESULT < 30 인 경우 : FLOOR(RESULT/30) → 0 - 30 <= RESULT < 40 인 경우 : FLOOR(RESULT/40) → 0 - 40 <= RESULT < 50 인 경우 : FLOOR(RESULT/50) → 0 - 50 <= RESULT < 60 인 경우 : FLOOR(RESULT/60) → 0 - 60 <= RESULT < 70 인 경우 : FLOOR(RESULT/70) → 0 - 70 <= RESULT < 80 인 경우 : FLOOR(RESULT/80) → 0 - 80 <= RESULT < 90 인 경우 : FLOOR(RESULT/90) → 0 - 90 <= RESULT < 100 인 경우 : FLOOR(RESULT/100) → 0

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 24.28 24.28 5180 5180 4 50 total 7 24.28 24.28 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY‘

4.DECODE 함수를 이용한 IF 처리의 효율화 개선된 SQL SQL#04_03 SELECT YEAR, DECODE(FLOOR(RESULT/10), 0,'A', DECODE(FLOOR(RESULT/20), 0,'B', DECODE(FLOOR(RESULT/30), 0,'C', DECODE(FLOOR(RESULT/40), 0,'D', DECODE(FLOOR(RESULT/50), 0,'E', DECODE(FLOOR(RESULT/60), 0,'F', DECODE(FLOOR(RESULT/70), 0,'G', DECODE(FLOOR(RESULT/80), 0,'H', DECODE(FLOOR(RESULT/90), 0,'I','J'))))))))) AS CLASS, SUM(CNT) FROM (SELECT YEAR, RESULT, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, RESULT) GROUP BY YEAR, DECODE(FLOOR(RESULT/90), 0,'I','J'))))))))); GROUP BY 활용을 통한 수행횟수 감소

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 4.34 4.34 5180 5180 4 50 total 7 4.35 4.35 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 589 VIEW 589 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 SQL SQL#04_04 SELECT YEAR, DECODE(FLOOR(RESULT/10), 0,'A', DECODE(FLOOR(RESULT/10), 1,'B', DECODE(FLOOR(RESULT/10), 2,'C', DECODE(FLOOR(RESULT/10), 3,'D', DECODE(FLOOR(RESULT/10), 4,'E', DECODE(FLOOR(RESULT/10), 5,'F', DECODE(FLOOR(RESULT/10), 6,'G', DECODE(FLOOR(RESULT/10), 7,'H', DECODE(FLOOR(RESULT/10), 8,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(FLOOR(RESULT/10), 8,'I','J'))))))))); FLOOR 함수는 절삭 된 값을 Return 합니다. IF 조건의 처리 단위가 10 단위라는 특이점이 있습니다. 따라서 다음과 같이 표현할 수가 있습니다. - RESULT < 10 인 경우 : FLOOR(RESULT/10) → 0 - 10 <= RESULT < 20 인 경우 : FLOOR(RESULT/10) → 1 - 20 <= RESULT < 30 인 경우 : FLOOR(RESULT/10) → 2 - 30 <= RESULT < 40 인 경우 : FLOOR(RESULT/10) → 3 - 40 <= RESULT < 50 인 경우 : FLOOR(RESULT/10) → 4 - 50 <= RESULT < 60 인 경우 : FLOOR(RESULT/10) → 5 - 60 <= RESULT < 70 인 경우 : FLOOR(RESULT/10) → 6 - 70 <= RESULT < 80 인 경우 : FLOOR(RESULT/10) → 7 - 80 <= RESULT < 90 인 경우 : FLOOR(RESULT/10) → 8 - 90 <= RESULT < 100 인 경우 : FLOOR(RESULT/10) → 9

4.DECODE 함수를 이용한 IF 처리의 효율화 개선된 SQL SQL#04_05 SELECT YEAR, DECODE(CLASS, 0,'A', 1,'B', 2,'C', 3,'D', 4,'E', 5,'F', 6,'G', 7,'H', 8,'I','J') AS CLASS, SUM(CNT) FROM (SELECT YEAR, FLOOR(RESULT/10) CLASS, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, FLOOR(RESULT/10)) GROUP BY YEAR, 6,'G', 7,'H', 8,'I','J'); GROUP BY 활용을 통한 수행횟수 감안 FLOOR 함수에 대한 적절한 표현식 사용으로 인해 FLOOR 및 DECODE 함수 의 개수를 줄임

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 5.40 5.40 5177 5180 4 50 total 7 5.40 5.41 5177 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 64 VIEW 64 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 개선된 SQL SQL#04_05 SELECT YEAR, DECODE(FLOOR(RESULT/10), 0,'A', 1, 'B', 2,'C', 3,'D', 4,'E', 5,'F', 6,'G', 7,'H', 8,'I','J') AS CLASS, SUM(CNT) FROM (SELECT YEAR, RESULT, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, RESULT) GROUP BY YEAR, 4,'E', 5,'F', 6,'G', 7,'H', 8,'I','J'); GROUP BY 활용을 통한 수행횟수 감안 FLOOR 함수에 대한 적절한 표현식 사용으로 인해 FLOOR 및 DECODE 함수 의 개수를 줄임 GROUP BY 활용을 통한 FLOOR 함수의 사용횟수 감소

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 4.28 4.28 5175 5180 4 50 total 7 4.28 4.28 5175 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 589 VIEW 589 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY

4.DECODE 함수를 이용한 IF 처리의 효율화 SQL#04_06 SQL IF RESULT =< 10 THEN 'A' ELSE IF RESULT =< 20 THEN 'B' ELSE IF RESULT =< 30 THEN 'C' ELSE IF RESULT =< 40 THEN 'D' ELSE IF RESULT =< 50 THEN 'E' ELSE IF RESULT =< 60 THEN 'F' ELSE IF RESULT =< 70 THEN 'G' ELSE IF RESULT =< 80 THEN 'H' ELSE IF RESULT =< 90 THEN 'I' ELSE 'J' END IF SELECT YEAR, DECODE(SIGN(RESULT-10),-1,'A',0,'A', DECODE(SIGN(RESULT-20),-1,'B',0,'B', DECODE(SIGN(RESULT-30),-1,'C',0,'C', DECODE(SIGN(RESULT-40),-1,'D',0,'D', DECODE(SIGN(RESULT-50),-1,'E',0,'E', DECODE(SIGN(RESULT-60),-1,'F',0,'F', DECODE(SIGN(RESULT-70),-1,'G',0,'G', DECODE(SIGN(RESULT-80),-1,'H',0,'H', DECODE(SIGN(RESULT-90),-1,'I',0,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(SIGN(RESULT-90),-1,'I',0,'I','J')))))))));

4.DECODE 함수를 이용한 IF 처리의 효율화 CEIL 함수를 사용한 SQL SQL#04_07 SELECT YEAR, DECODE(CEIL(RESULT/10), 0,'A',1,'A', DECODE(CEIL(RESULT/20),1,'B', DECODE(CEIL(RESULT/30),1,'C', DECODE(CEIL(RESULT/40),1,'D', DECODE(CEIL(RESULT/50),1,'E', DECODE(CEIL(RESULT/60),1,'F', DECODE(CEIL(RESULT/70),1,'G', DECODE(CEIL(RESULT/80),1,'H', DECODE(CEIL(RESULT/90),1,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(CEIL(RESULT/90),1,'I','J'))))))))); CEIL 함수는 절상 된 값을 Return 합니다. - RESULT = 0 인 경우 : CEIL(RESULT/10) → 0 - 0 < RESULT <= 10 인 경우 : CEIL(RESULT/10) → 1 - 10 < RESULT <= 20 인 경우 : CEIL(RESULT/20) → 1 - 20 < RESULT <= 30 인 경우 : CEIL(RESULT/30) → 1 - 30 < RESULT <= 40 인 경우 : CEIL(RESULT/40) → 1 - 40 < RESULT <= 50 인 경우 : CEIL(RESULT/50) → 1 - 50 < RESULT <= 60 인 경우 : CEIL(RESULT/60) → 1 - 60 < RESULT <= 70 인 경우 : CEIL(RESULT/70) → 1 - 70 < RESULT <= 80 인 경우 : CEIL(RESULT/80) → 1 - 80 < RESULT <= 90 인 경우 : CEIL(RESULT/90) → 1 - 90 < RESULT <= 100 인 경우 : CEIL(RESULT/100) → 1

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 25.62 25.63 5180 5180 4 50 total 7 25.63 25.63 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 SQL#04_08 SELECT YEAR, DECODE(CEIL(RESULT/10), 0,'A',1,'A', DECODE(CEIL(RESULT/10),2,'B', DECODE(CEIL(RESULT/10),3,'C', DECODE(CEIL(RESULT/10),4,'D', DECODE(CEIL(RESULT/10),5,'E', DECODE(CEIL(RESULT/10),6,'F', DECODE(CEIL(RESULT/10),7,'G', DECODE(CEIL(RESULT/10),8,'H', DECODE(CEIL(RESULT/10),9,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(CEIL(RESULT/10),9,'I','J'))))))))); CEIL 함수는 절상 된 값을 Return 합니다. IF 조건의 처리 단위가 10 단위라는 특이점이 있습니다. 따라서 다음과 같이 표현할 수가 있습니다. - RESULT = 0 인 경우 : CEIL(RESULT/10) → 0 - 0 < RESULT <= 10 인 경우 : CEIL(RESULT/10) → 1 - 10 < RESULT <= 20 인 경우 : CEIL(RESULT/10) → 2 - 20 < RESULT <= 30 인 경우 : CEIL(RESULT/10) → 3 - 30 < RESULT <= 40 인 경우 : CEIL(RESULT/10) → 4 - 40 < RESULT <= 50 인 경우 : CEIL(RESULT/10) → 5 - 50 < RESULT <= 60 인 경우 : CEIL(RESULT/10) → 6 - 60 < RESULT <= 70 인 경우 : CEIL(RESULT/10) → 7 - 70 < RESULT <= 80 인 경우 : CEIL(RESULT/10) → 8 - 80 < RESULT <= 90 인 경우 : CEIL(RESULT/10) → 9 - 90 < RESULT <= 100 인 경우 : CEIL(RESULT/10) → 10

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 19.32 19.31 5180 5180 4 50 total 7 19.32 19.31 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 GREATEST 함수를 사용한 SQL SQL#04_09 SELECT YEAR, DECODE(GREATEST(RESULT,10),10,'A',DECODE(GREATEST(RESULT,20),20,'B', DECODE(GREATEST(RESULT,30),30,'C',DECODE(GREATEST(RESULT,40),40,'D', DECODE(GREATEST(RESULT,50),50,'E',DECODE(GREATEST(RESULT,60),60,'F', DECODE(GREATEST(RESULT,70),70,'G',DECODE(GREATEST(RESULT,80),80,'H', DECODE(GREATEST(RESULT,90),90,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(GREATEST(RESULT,90),90,'I','J'))))))))); GREATEST 함수는 큰 값을 식별하기 위한 함수입니다. 다른 함수들과는 달리 비교되는 값들의 데이터 타입에 전혀 영향을 받지 않으며, 특히 SIGN, CEIL, FLOOR 처럼 별도의 연산을 할 필요 가 없습니다. - RESULT <= 10 인 경우 : GREATEST(RESULT,10) → 10 - 10 < RESULT <= 20 인 경우 : GREATEST(RESULT,20) → 20 - 20 < RESULT <= 30 인 경우 : GREATEST(RESULT,30) → 30 - 30 < RESULT <= 40 인 경우 : GREATEST(RESULT,40) → 40 - 40 < RESULT <= 50 인 경우 : GREATEST(RESULT,50) → 50 - 50 < RESULT <= 60 인 경우 : GREATEST(RESULT,60) → 60 - 60 < RESULT <= 70 인 경우 : GREATEST(RESULT,70) → 70 - 70 < RESULT <= 80 인 경우 : GREATEST(RESULT,80) → 80 - 80 < RESULT <= 90 인 경우 : GREATEST(RESULT,90) → 90 - 90 < RESULT <= 100 인 경우 : GREATEST(RESULT,100) → 100

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 11.95 11.94 5180 5180 4 50 total 7 11.96 11.95 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 LEAST 함수를 사용한 SQL SQL#04_10 SELECT YEAR, DECODE(LEAST(RESULT,10),RESULT,'A',DECODE(LEAST(RESULT,20),RESULT,'B', DECODE(LEAST(RESULT,30),RESULT,'C',DECODE(LEAST(RESULT,40),RESULT,'D', DECODE(LEAST(RESULT,50),RESULT,'E',DECODE(LEAST(RESULT,60),RESULT,'F', DECODE(LEAST(RESULT,70),RESULT,'G',DECODE(LEAST(RESULT,80),RESULT,'H', DECODE(LEAST(RESULT,90),RESULT,'I','J'))))))))) AS CLASS, COUNT(*) FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, DECODE(LEAST(RESULT,90),RESULT,'I','J'))))))))); LEAST 함수는 작은 값을 식별하기 위한 함수입니다. GREATEST 와 마찬가지로 비교되는 값들의 데이터 타입에 전혀 영향을 받지 않으며, 특히 SIGN, CEIL, FLOOR 처럼 별도의 연산을 할 필요가 없습니다. - RESULT <= 10 인 경우 : LEAST(RESULT,10) → RESULT - 10 < RESULT <= 20 인 경우 : LEAST(RESULT,20) → RESULT - 20 < RESULT <= 30 인 경우 : LEAST(RESULT,30) → RESULT - 30 < RESULT <= 40 인 경우 : LEAST(RESULT,40) → RESULT - 40 < RESULT <= 50 인 경우 : LEAST(RESULT,50) → RESULT - 50 < RESULT <= 60 인 경우 : LEAST(RESULT,60) → RESULT - 60 < RESULT <= 70 인 경우 : LEAST(RESULT,70) → RESULT - 70 < RESULT <= 80 인 경우 : LEAST(RESULT,80) → RESULT - 80 < RESULT <= 90 인 경우 : LEAST(RESULT,90) → RESULT - 90 < RESULT <= 100 인 경우 : LEAST(RESULT,100) → RESULT

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.04 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 11.17 11.17 5180 5180 4 50 total 7 11.18 11.21 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 개선된 SQL SQL#04_11 SELECT YEAR, DECODE(CEIL(RESULT/10), 0,'A', 1,'A', 2,'B', 3,'C', 4,'D', 5,'E', 6,'F', 7,'G', 8,'H', 9,'I','J') AS CLASS, SUM(CNT) FROM (SELECT YEAR, RESULT, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, RESULT) GROUP BY YEAR, 6,'F', 7,'G', 8,'H', 9,'I','J'); GROUP BY 활용을 통한 수행횟수 감안 CEIL 함수에 대한 적절한 표현식 사용으로 인해 CEIL 및 DECODE 함수 의 개수를 줄임

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 4.33 4.33 5180 5180 4 50 total 7 4.33 4.34 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 589 VIEW 589 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 SQL#04_11 SELECT YEAR, DECODE(GREATEST(RESULT,10),10,'A',DECODE(GREATEST(RESULT,20),20,'B', DECODE(GREATEST(RESULT,30),30,'C',DECODE(GREATEST(RESULT,40),40,'D', DECODE(GREATEST(RESULT,50),50,'E',DECODE(GREATEST(RESULT,60),60,'F', DECODE(GREATEST(RESULT,70),70,'G',DECODE(GREATEST(RESULT,80),80,'H', DECODE(GREATEST(RESULT,90),90,'I','J'))))))))) AS CLASS, SUM(CNT) FROM (SELECT YEAR, RESULT, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, RESULT) GROUP BY YEAR, DECODE(GREATEST(RESULT,90),90,'I','J'))))))))); GROUP BY 활용을 통한 수행횟수 감안 GREATEST 함수 사용으로 인해 SIGN 또는 CEIL 함수 사용시 발생하던 불 필요한 연산이 없어짐

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 4.30 4.30 5180 5180 4 50 total 7 4.30 4.31 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 589 VIEW 589 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'

4.DECODE 함수를 이용한 IF 처리의 효율화 SQL#04_11 SELECT YEAR, DECODE(LEAST(RESULT,10),RESULT,'A',DECODE(LEAST(RESULT,20),RESULT,'B', DECODE(LEAST(RESULT,30),RESULT,'C',DECODE(LEAST(RESULT,40),RESULT,'D', DECODE(LEAST(RESULT,50),RESULT,'E',DECODE(LEAST(RESULT,60),RESULT,'F', DECODE(LEAST(RESULT,70),RESULT,'G',DECODE(LEAST(RESULT,80),RESULT,'H', DECODE(LEAST(RESULT,90),RESULT,'I','J'))))))))) AS CLASS, SUM(CNT) FROM (SELECT YEAR, RESULT, COUNT(*) CNT FROM EC_EXAM_APPLY WHERE UPDATE_USER <> 'LANGUAGE_MANAGER' GROUP BY YEAR, RESULT) GROUP BY YEAR, DECODE(LEAST(RESULT,90),RESULT,'I','J'))))))))); GROUP BY 활용을 통한 수행횟수 감안 LEAST 함수 사용으로 인해 SIGN 또는 CEIL 함수 사용시 발생하던 불 필요한 연산이 없어짐

4.DECODE 함수를 이용한 IF 처리의 효율화 Trace 정보 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.01 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 5 4.28 4.28 5180 5180 4 50 total 7 4.29 4.29 5180 5180 4 50 Rows Execution Plan ------- --------------------------------------------------- 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 589 VIEW 589 SORT (GROUP BY) 504056 TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'