NVL, NVL2, DECODE, COALESCE, CASE 단순 성능 비교

[ 결론 ]  
   : 단순 비교 결과 어느 것이 성능이 좋다는 유의미한 결과 전혀 없으며, 각 Function과 Expression 에 따른 특성 이해를
     바탕으로 업무 SQL에서 어느 것을 선택하여 잘 사용하는 것이 핵심

 

1. 테스트
    : " TB_TEST " 테이블의 특정 컬럼 데이터 5백 만 건 중 4,163,638건을  'KTH' 로  변환하여 성능 비교.
      각 수행 되는 SQL은 모두 DISK I/O 없도록 처리함.

 


2. 결과 
 : NVL, COALESCE, NVL2, DECODE, CASE 순으로 빠르게 출력되나 의미 있는 수치 아님

[1] NVL      : Active Time :2023/08/22 16:43:45 / Execution : 1 / CPU Elapsed : 2.88   / Elapsed : 2.88   / Buffer : 284353 / DISK RATIO : 0
[2] NVL2     : Active Time :2023/08/22 16:43:48 / Execution : 1 / CPU Elapsed : 2.949  / Elapsed : 2.949  / Buffer : 284353 / DISK RATIO : 0
[3] DECODE   : Active Time :2023/08/22 16:43:50 / Execution : 1 / CPU Elapsed : 2.9979 / Elapsed : 2.9979 / Buffer : 284353 / DISK RATIO : 0
[4] COALESCE : Active Time :2023/08/22 16:43:53 / Execution : 1 / CPU Elapsed : 2.8752 / Elapsed : 2.8752 / Buffer : 284353 / DISK RATIO : 0
[5] CASE     : Active Time :2023/08/22 16:43:56 / Execution : 1 / CPU Elapsed : 3.0111 / Elapsed : 3.0111 / Buffer : 284353 / DISK RATIO : 0

 

 

3. TEST 쿼리
SELECT NVL( CODE, 'KTH' ), COUNT(*) 
  FROM  TB_TEST  
WHERE ROWNUM <= 5000000     
GROUP BY NVL( CODE, 'KTH' ) 

SELECT NVL2( CODE, CODE, 'KTH' ), COUNT(*) 
  FROM  TB_TEST
 WHERE ROWNUM <= 5000000    
 GROUP BY NVL2( CODE, CODE, 'KTH' )  

SELECT DECODE( CODE, NULL , 'KTH' ,CODE)  , COUNT(*) 
  FROM  TB_TEST
 WHERE ROWNUM <= 5000000        
 GROUP BY DECODE( CODE, NULL , 'KTH' ,CODE) 

SELECT  COALESCE ( CODE, 'KTH' )   , COUNT(*) 
  FROM  TB_TEST
 WHERE ROWNUM <= 5000000    
 GROUP BY COALESCE ( CODE, 'KTH' ) 

SELECT CASE WHEN CODE IS NULL THEN 'KTH' ELSE CODE END, COUNT(*) 
  FROM TB_TEST 
 WHERE ROWNUM <= 5000000    
GROUP BY CASE WHEN CODE IS NULL THEN 'KTH' ELSE CODE END 

'ORACLE > SQL' 카테고리의 다른 글

DBMS_RANDOM.STRING 사용법  (0) 2024.06.15