1번 플랜과 2번 플랜 두가지가 존재합니다.
1번 플랜은 풀스캔을 타는데다가 플랜에서 나타나는 Cardinality Cost가 수치가 매우 높게 나타납니다.
풀스캔을 타니 당연하다고 생각했습니다.
그런데 2번 플랜은 인덱스도 제대로 타고 있고, Cardinality와 Cost가 무척 적게 나타나는 것을 알 수 있습니다.
그런데 문제는 두 쿼리의 실행결과 속도입니다. 실행결과 속도를 비교해보았는데 놀랍게도
두 쿼리 5번 정도 돌려본 결과
1번 쿼리는 수행속도가 0.8~0.9초 정도 걸리는 반면에 2번 쿼리는 2.2~3.0초 정도의 수행속도 결과를 나타내고 있습니다.
어떻게 하면 이러한 결과가 나타나는지 궁금합니다.
1번쿼리와 2번 쿼리의 차이는 WHERE 조건에서 기간입력한것과 안한것의 차이입니다.
아래의 쿼리를 수행결과 나타난 결과입니다. 조언 부탁드립니다.
SELECT MONTHS
, ROUND(MAX(M1_VAL) * 100 / MAX(M2_VAL),1) PERC
FROM
(
SELECT INDEX.FC_GET_CONV_DATE('1',ADM_DTE) MONTHS
, COUNT(A.PT_NO) M1_VAL
, NULL M2_VAL
FROM
(
SELECT PT_NO
, ADM_DTE
, DECODE(C074,'1',1,0)
+ DECODE(C078,'1',1,0)
+ DECODE(C082,'1',1,0)
+ DECODE(C086,'1',1,0)
+ DECODE(C090,'1',1,0)
+ DECODE(C094,'1',1,0) CSUM
, PK_HEMODIALYSIS_INDEX.FC_GETCYCLE_YN(PT_NO, ADM_DTE) C_YN
FROM OM_DF_BL_DLSI_MEVLELDT
WHERE (( C074 = '1') OR
( C078 = '1') OR
( C082 = '1') OR
( C086 = '1') OR
( C090 = '1') OR
( C094 = '1'))
AND C015 = '1'
) A
WHERE CSUM >= 3
AND C_YN = 'Y'
GROUP BY ADM_DTE
UNION ALL
SELECT INDEX.FC_GET_CONV_DATE('1',ADM_DTE) MONTHS
, NULL M1_VAL
, COUNT(PT_NO) M2_VAL
FROM OM_DF_BL_DLSI_MEVLELDT
WHERE C015 = '1'
AND LAYOUT_TYPE = 'HD'
AND FORM_ID = 'HF2013'
AND FORM_VER = '2'
GROUP BY ADM_DTE
)
WHERE MONTHS >= '2012-01' AND MONTHS <= '2012-06'
GROUP BY MONTHS
ORDER BY MONTHS
질문하신 내용과는 전혀 다른 관점에서 답변 드리겠습니다.
fc_get_conv_date 이 사용자 함수는 별 특별한 내용이 없는 함수인듯 합니다.
단순 포멧 변경 함수인듯 한데요.
즉, 사용자 함수 사용안하고, 내장함수만으로도 충분히 구현가능한 기능이라 생각되구요.
사용자 함수 사용한 값에 대해 밖에서 조건주는것보다는
원본 컬럼(ADM_DTE)을 가공없이 그대로 조건을 주는게 좋습니다.
ADM_DTE 에 저장된 데이터 형태를 알려주세요.
date 타입인지? Varchar2 타입인지?
varchar2 타입이라면? 길이와 포멧은 어떻게 되는지?
아 그리고 위에 인덱스 구성이 어떻게 되는지?
SELECT TO_CHAR(adm_dte, 'yyyy-mm') months , ROUND( COUNT(CASE WHEN csum >= 3 AND c_yn = 'Y' THEN pt_no END) / COUNT(CASE WHEN layout_type = 'HD' AND form_id = 'HF2013' AND form_ver = '2' THEN pt_no END) * 100, 1) perc FROM ( SELECT pt_no , adm_dte , DECODE(C074, '1', 1, 0) + DECODE(C078, '1', 1, 0) + DECODE(C082, '1', 1, 0) + DECODE(C086, '1', 1, 0) + DECODE(C090, '1', 1, 0) + DECODE(C094, '1', 1, 0) csum , pk_hemodialysis_index.fc_getcycle_yn(pt_no, adm_dte) c_yn , layout_type , form_id , form_ver FROM om_df_bl_dlsi_mevleldt WHERE c015 = '1' AND adm_dte >= TO_DATE('2012-01', 'yyyy-mm') AND adm_dte < ADD_MONTHS(TO_DATE('2012-06', 'yyyy-mm'), 1) ) WHERE (layout_type = 'HD' AND form_id = 'HF2013' AND form_ver = '2') OR (csum >= 3 AND c_yn = 'Y') GROUP BY TO_CHAR(adm_dte, 'yyyy-mm') ORDER BY months ;