프로그래밍백엔드 개발자

SQL에서 사용자 정의 함수(UDF)를 사용하여 복잡한 비즈니스 규칙 및 계산을 직접 구현하는 방법은 무엇입니까? 스칼라 UDF와 테이블 UDF 간의 차이점과 제한 사항은 무엇이며, 어떤 경우에 이를 사용하는 것이 적합하고 외부 애플리케이션에서 비즈니스 논리를 구현하는 것이 더 나은가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

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);

차이점, 제약 사항 및 권장 사항:

  • 스칼라 UDF는 큰 선택 집합에서 성능이 낮을 수 있으며, 행 단위로 호출되기 때문입니다;
  • 테이블 UDF는 쿼리 계획에 더 잘 통합되고 일반 테이블처럼 사용할 수 있습니다;
  • 외부 자원에 대한 접근이 필요하거나 복잡한 비즈니스 처리가 필요한 논리는 SQL 외부로 빼는 것이 좋습니다.

덫 질문.

인라인 테이블 함수와 다중 문(statement) 테이블 함수의 차이는 무엇인가요? 이 선택이 성능에 미치는 영향은 무엇인가요?

답변 및 예제:

  • 인라인 함수(single-statement, 즉시 SELECT 반환)는 기본 쿼리의 일부로 최적화되며, 추가 테이블을 생성하지 않아 더 빠르고 쿼리 계획도 공유됩니다.
  • 다중 문 함수는 임시 테이블(테이블 변수)을 생성하여 일반적으로 쿼리 계획이 더 나빠지고 카디널리티 추정 오류가 발생할 수 있으며 성능 저하가 있을 수 있습니다.
-- 인라인 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는 백엔드와 데이터베이스 간의 변경 조정 비용을 높였습니다.