함수 자체는 쿼리와 별개로 돌아가는 부분이라
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