날짜 컬럼 선택해서 조회하는 방법 0 1 5,537

by 끼륭 [SQL Query] [2024.11.28 21:08:01]


안녕하세요

FN_GETDATE 는 파라미터에 따라 날짜를 '20010101' 같이 받아오는 함수인데
WHERE 절에 사용하게 되면 너무 느리게 뜹니다
혹시 함수를 사용하면서 비교하는 다른 방법이 있을까요?

SELECT CD
     , CD_NM
     , FN_GETDATE(CD) AS DDTT
   FROM TB_MAIN
WHERE FN_GETDATE(CD) BETWEEN '20241001' AND '20241101'

 

by 마농 [2024.11.29 08:21:30]

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

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입