안녕하세요
FN_GETDATE 는 파라미터에 따라 날짜를 '20010101' 같이 받아오는 함수인데
WHERE 절에 사용하게 되면 너무 느리게 뜹니다
혹시 함수를 사용하면서 비교하는 다른 방법이 있을까요?
SELECT CD
, CD_NM
, FN_GETDATE(CD) AS DDTT
FROM TB_MAIN
WHERE FN_GETDATE(CD) BETWEEN '20241001' AND '20241101'
함수 자체는 쿼리와 별개로 돌아가는 부분이라
1. 함수를 풀어서 쿼리에 녹여내는 방법이 최선입니다.
2. 함수를 풀 수 없다면, 함수 내부 로직에 비효율을 찾아 제거하는 것이고(최적화)
3. 함수의 사용을 줄여야 합니다.
- 위 쿼리는 함수가 두번 사용되는데(전체행수 * 2)
- 한번만 사용되도록 인라인뷰를 이용할 수 있고
- 인라인뷰가 머지되지 않도록 힌트 추가
- 입력값인 cd 값에 중복값이 많다면?
- 스칼라서브쿼리 캐싱 효과를 기대해 볼 수 있습니다.
SELECT *
FROM (SELECT /*+ NO_MERGE */
cd
, cd_nm
, (SELECT fn_getdate(cd) FROM dual) ddtt
FROM tb_main
)
WHERE dddt BETWEEN '20241001' AND '20241101'
;
4. 함수기반 인덱스를 이용하는 방법도 있습니다.
- FBI : Function Based Index