움..질문이라기 보다 예상외의 실행계획이 있어서 올립니다. 한 쿼리에 함수를 중복사용했을때 실행계획에 관해서입니다.
2백만건이 있는 고객테이블이 있고, 고객의 가입매장명을 가져오는 FN_매장명() 함수가 있습니다.
select 'A'
from 고객테이블 A
GROUP BY dbo.FN_매장명(A.가입매장코드)
실행시 40초가 걸렸습니다..그렇다면
select dbo.FN_매장명(A.가입매장코드)
from 고객테이블 A
GROUP BY dbo.FN_매장명(A.가입매장코드)
이거는? 역시 40초 나오더군요 . 함수를 두번쓰긴했어도 한번의 연산으로 값을 공유했습니다. 실행중간에 Expr1001 이런식으로
중간값을 만든후 재사용했습니다. 그렇담
select dbo.FN_매장명(A.가입매장코드),
dbo.FN_매장명(A.가입매장코드)+'A',
dbo.FN_매장명(A.가입매장코드)+'B',
dbo.FN_매장명(A.가입매장코드)+'C',
dbo.FN_매장명(A.가입매장코드)+'D'
from 고객테이블 A
GROUP BY dbo.FN_매장명(A.가입매장코드)
요것은?.....역시 중간결과값의 재사용으로 인해서 함수가 불필요하게 반복수행되지는 않습니다...그럼 그룹을 빼면?
select dbo.FN_매장명(A.가입매장코드),
dbo.FN_매장명(A.가입매장코드)+'A',
dbo.FN_매장명(A.가입매장코드)+'B',
dbo.FN_매장명(A.가입매장코드)+'C',
dbo.FN_매장명(A.가입매장코드)+'D'
from 고객테이블 A
함수를 하나만 썼을때와 비교해서 몇배가 느려졌습니다... 함수를 5번이나 실행했구요. 중간값도 만들긴 하는데 각각 Expr1001, Expr1002
....Expr1005 개를 각각 연산해서 만들구요.
함수 사용시,,,특히 여러번 중복해서 사용할때는 실행계획을 꼭 살펴보고 최소한으로만 탈수있도록 해야할듯 합니다.
적절한 인덱싱된 뷰를 사용하시는 건 어떨지요?
기왕이면 인덱스를 타도록 쿼리를 변경하시고 뷰와 같이해서 사용하신다면~
엄청 빨라질거 같군요.