by 도뎡이 [SQL Query] count case when 쿼리 성능 개선 [2023.03.13 10:50:16]
1 2 3 4 5 6 7 8 9 10 11 | 안녕하세요! DB는 큐브리드이고, 쿼리는 다음과 같습니다. select COUNT ( CASE WHEN type = 'SU' THEN 1 END ) AS SU , COUNT ( CASE WHEN type = 'CH' AND ch_type = '1' THEN 1 END ) AS CH1 , COUNT ( CASE WHEN type = 'CH' AND ch_type = '2' THEN 1 END ) AS CH2 , COUNT ( CASE WHEN type = 'EV' THEN 1 END ) AS EV , COUNT ( CASE WHEN type = 'ER' THEN 1 END ) AS ER , COUNT ( CASE WHEN type = 'PL' THEN 1 END ) AS PL from tb_sample |
;
type과 ch_type 모두 인덱스가 걸려있는 컬럼입니다.
조건이 포함되지 않는 상황에 어떻게 쿼리의 성능을 개선할 수 있을까요?
선배님들의 피드백 미리 감사드립니다!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | -- 오라클 기준으로 힌트 작성해 봤습니다. index fast full scan -- 그룹바이를 2단계로 수행하여 Case 문의 수행 회수를 줄입니다. SELECT NVL( SUM ( CASE WHEN type = 'SU' THEN cnt END ), 0) su , NVL( SUM ( CASE WHEN type = 'CH' AND ch_type = '1' THEN cnt END ), 0) ch1 , NVL( SUM ( CASE WHEN type = 'CH' AND ch_type = '2' THEN cnt END ), 0) ch2 , NVL( SUM ( CASE WHEN type = 'EV' THEN cnt END ), 0) ev , NVL( SUM ( CASE WHEN type = 'ER' THEN cnt END ), 0) er , NVL( SUM ( CASE WHEN type = 'PL' THEN cnt END ), 0) pl FROM ( SELECT /*+ INDEX_FFS(tb_sample 인덱스명) */ type, ch_type , COUNT (*) cnt FROM tb_sample GROUP BY type, ch_type ) a ; |