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'