Download presentation
Presentation is loading. Please wait.
1
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 처리를 하고자 할 때 어 떻게 하면 보다 더 효율적으로 사용할 수 있는지를 찾아 보고자 합니다.
2
4.DECODE 함수를 이용한 IF 처리의 효율화
Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY' . EC_EXAM_APPLY 점수 별 DECODE(SIGN(연산),…, DECODE(…))…) 처리 GROUP BY 1차가공 2차가공 504056
3
4.DECODE 함수를 이용한 IF 처리의 효율화
문제점 DECODE(…) 문장에서 DECODE() 내에 있는 점수 별 데이터 처리는 추출된 데이터 마다 즉, Row 단위로 수행되고 있으며 특히 다양한 ELSE 부분 처리를 위해서 너 무 많은 DECODE 함수를 사용하고 있습니다. 문제점을 해결하기 위한 방안 DECODE(…) 문장에서 DECODE() 내에 있는 점수 별 데이터 처리는 GROUP BY를 활용 함으로써 전반적으로 내부적인 수행횟수를 감소 시킬 수 있으며 특히 다양한 ELSE 부분 처리를 위해서 사용한 DECODE 함수의 사용 개수를 줄일 수 있도록 해야 합니다.
4
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) → <= RESULT < 20 인 경우 : FLOOR(RESULT/20) → <= RESULT < 30 인 경우 : FLOOR(RESULT/30) → <= RESULT < 40 인 경우 : FLOOR(RESULT/40) → <= RESULT < 50 인 경우 : FLOOR(RESULT/50) → <= RESULT < 60 인 경우 : FLOOR(RESULT/60) → <= RESULT < 70 인 경우 : FLOOR(RESULT/70) → <= RESULT < 80 인 경우 : FLOOR(RESULT/80) → <= RESULT < 90 인 경우 : FLOOR(RESULT/90) → <= RESULT < 100 인 경우 : FLOOR(RESULT/100) → 0
5
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY‘
6
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 활용을 통한 수행횟수 감소
7
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
8
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) → <= RESULT < 20 인 경우 : FLOOR(RESULT/10) → <= RESULT < 30 인 경우 : FLOOR(RESULT/10) → <= RESULT < 40 인 경우 : FLOOR(RESULT/10) → <= RESULT < 50 인 경우 : FLOOR(RESULT/10) → <= RESULT < 60 인 경우 : FLOOR(RESULT/10) → <= RESULT < 70 인 경우 : FLOOR(RESULT/10) → <= RESULT < 80 인 경우 : FLOOR(RESULT/10) → <= RESULT < 90 인 경우 : FLOOR(RESULT/10) → <= RESULT < 100 인 경우 : FLOOR(RESULT/10) → 9
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 함수 의 개수를 줄임
10
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) 64 VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
11
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 함수의 사용횟수 감소
12
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY
13
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')))))))));
14
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) → < RESULT <= 10 인 경우 : CEIL(RESULT/10) → < RESULT <= 20 인 경우 : CEIL(RESULT/20) → < RESULT <= 30 인 경우 : CEIL(RESULT/30) → < RESULT <= 40 인 경우 : CEIL(RESULT/40) → < RESULT <= 50 인 경우 : CEIL(RESULT/50) → < RESULT <= 60 인 경우 : CEIL(RESULT/60) → < RESULT <= 70 인 경우 : CEIL(RESULT/70) → < RESULT <= 80 인 경우 : CEIL(RESULT/80) → < RESULT <= 90 인 경우 : CEIL(RESULT/90) → < RESULT <= 100 인 경우 : CEIL(RESULT/100) → 1
15
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
16
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) → < RESULT <= 10 인 경우 : CEIL(RESULT/10) → < RESULT <= 20 인 경우 : CEIL(RESULT/10) → < RESULT <= 30 인 경우 : CEIL(RESULT/10) → < RESULT <= 40 인 경우 : CEIL(RESULT/10) → < RESULT <= 50 인 경우 : CEIL(RESULT/10) → < RESULT <= 60 인 경우 : CEIL(RESULT/10) → < RESULT <= 70 인 경우 : CEIL(RESULT/10) → < RESULT <= 80 인 경우 : CEIL(RESULT/10) → < RESULT <= 90 인 경우 : CEIL(RESULT/10) → < RESULT <= 100 인 경우 : CEIL(RESULT/10) → 10
17
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
18
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) → < RESULT <= 20 인 경우 : GREATEST(RESULT,20) → < RESULT <= 30 인 경우 : GREATEST(RESULT,30) → < RESULT <= 40 인 경우 : GREATEST(RESULT,40) → < RESULT <= 50 인 경우 : GREATEST(RESULT,50) → < RESULT <= 60 인 경우 : GREATEST(RESULT,60) → < RESULT <= 70 인 경우 : GREATEST(RESULT,70) → < RESULT <= 80 인 경우 : GREATEST(RESULT,80) → < RESULT <= 90 인 경우 : GREATEST(RESULT,90) → < RESULT <= 100 인 경우 : GREATEST(RESULT,100) → 100
19
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
20
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 < RESULT <= 20 인 경우 : LEAST(RESULT,20) → RESULT < RESULT <= 30 인 경우 : LEAST(RESULT,30) → RESULT < RESULT <= 40 인 경우 : LEAST(RESULT,40) → RESULT < RESULT <= 50 인 경우 : LEAST(RESULT,50) → RESULT < RESULT <= 60 인 경우 : LEAST(RESULT,60) → RESULT < RESULT <= 70 인 경우 : LEAST(RESULT,70) → RESULT < RESULT <= 80 인 경우 : LEAST(RESULT,80) → RESULT < RESULT <= 90 인 경우 : LEAST(RESULT,90) → RESULT < RESULT <= 100 인 경우 : LEAST(RESULT,100) → RESULT
21
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
22
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 함수 의 개수를 줄임
23
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
24
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 함수 사용시 발생하던 불 필요한 연산이 없어짐
25
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
26
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 함수 사용시 발생하던 불 필요한 연산이 없어짐
27
4.DECODE 함수를 이용한 IF 처리의 효율화
Trace 정보 call count cpu elapsed disk query current rows Parse Execute Fetch total Rows Execution Plan 0 SELECT STATEMENT GOAL: CHOOSE 50 SORT (GROUP BY) VIEW SORT (GROUP BY) TABLE ACCESS (FULL) OF 'EC_EXAM_APPLY'
Similar presentations