SQL에서는 사용자 정의 함수(User Defined Functions, UDF)를 통해 비즈니스 논리를 구현할 수 있으며, 이는 일부 계산 및 비즈니스 규칙을 데이터베이스로 옮길 수 있게 해줍니다.
스칼라 함수는 단일 값을 반환하고 표현식에서 호출됩니다. 예를 들어, 매개변수를 기반으로 합계를 계산할 때:
CREATE FUNCTION dbo.GetDiscount(@price DECIMAL(10,2), @loyaltyLevel INT) RETURNS DECIMAL(10,2) AS BEGIN RETURN @price * CASE WHEN @loyaltyLevel = 1 THEN 0.95 WHEN @loyaltyLevel = 2 THEN 0.90 ELSE 1.0 END END; -- 사용 예: SELECT Name, dbo.GetDiscount(Price, LoyaltyLevel) AS DiscountPrice FROM Products;
테이블 함수는 행 집합(테이블)을 반환합니다:
CREATE FUNCTION dbo.ActiveOrders(@userId INT) RETURNS TABLE AS RETURN ( SELECT * FROM Orders WHERE UserId = @userId AND Status = 'Active' ); -- 사용: SELECT * FROM dbo.ActiveOrders(123);
차이점, 제약 사항 및 권장 사항:
인라인 테이블 함수와 다중 문(statement) 테이블 함수의 차이는 무엇인가요? 이 선택이 성능에 미치는 영향은 무엇인가요?
답변 및 예제:
-- 인라인 CREATE FUNCTION dbo.InlineActiveOrders(@userId INT) RETURNS TABLE AS RETURN ( SELECT * FROM Orders WHERE UserId = @userId AND Status = 'Active' ); -- 다중 문 CREATE FUNCTION dbo.MultiActiveOrders(@userId INT) RETURNS @result TABLE (...) AS BEGIN INSERT INTO @result SELECT ... -- 논리 RETURN END
역사
프로젝트: 재무 분석.
대규모 테이블에 대한 보고서 쿼리의 select 부분에서 스칼라 UDF를 사용했습니다: SELECT Amount, dbo.CalcTax(Amount, Type) FROM Transactions. UDF의 행별 처리로 인해 쿼리가 5-10분 소요되었습니다. 조건문으로 다시 작성하니 시간이 몇 초로 줄어들었습니다.
역사
프로젝트: 전자 상거래. 사용자 장바구니를 찾기 위해 여러 단계에서 필터링 논리를 가진 다중 문 테이블 함수를 사용했습니다. SQL이 최적의 계획을 생성하지 않고, 한 요소만 필요해도 스캔을 수행함을 알게 되었습니다. 인라인 함수로 변경하니 쿼리 속도가 50배 빨라졌습니다.
역사
프로젝트: CRM. 보너스 계산 비즈니스 논리를 복잡한 UDF로 옮겼습니다. 몇 달 후 비즈니스 공식이 변경되었고, 데이터를 강하게 연결되어 있어 함수 업데이트가 어려웠습니다. 반복적인 제품에서 UDF는 백엔드와 데이터베이스 간의 변경 조정 비용을 높였습니다.