SQL Server 테이블 반환 함수: 인라인 함수와 다중 문 함수 비교
SQL Server의 TVF(테이블 반환 함수)를 사용하면 단일 함수 호출에서 여러 데이터 행을 반환할 수 있습니다. 그러나 TVF는 크게 다중문 함수와 인라인 함수의 두 가지 유형으로 나뉜다.
인라인 테이블 값 함수(ITVF)
ITVF는 함수 정의 내에서 단일 SELECT 문을 사용하여 정의됩니다. 이는 참조된 열의 데이터 유형, Null 허용 여부 및 데이터 정렬을 상속하여 뷰처럼 작동합니다.
다중 명령문 테이블 값 함수(MSTVF)
MSTVF는 일반적으로 테이블 변수를 채우는 INSERT 문을 포함한 여러 문을 사용하여 정의됩니다. 함수 정의에서 열의 데이터 유형과 속성을 명시적으로 선언해야 합니다.
성능 차이
다른 구문에도 불구하고 ITVF와 MSTVF의 성능 차이는 상당합니다. ITVF는 SQL Server의 테이블 통계 기반 쿼리 최적화 프로그램을 최대한 활용하여 효율적인 실행 계획을 생성합니다. MSTVF는 테이블 변수에 가깝고 쿼리 최적화 프로그램의 최적화 효과가 낮으며 실행 계획 효율성이 상대적으로 낮습니다.
적용 가능한 시나리오
ITVF와 MSTVF의 선택은 특정 적용 시나리오에 따라 다릅니다. 함수 논리를 간단한 SELECT 문으로 표현할 수 있는 경우 일반적으로 ITVF가 더 효율적이며 권장됩니다. MSTVF는 추가 처리나 매개변수화가 필요한 경우에 더 적합합니다.
예
다음 예를 고려해 보세요.
<code class="language-sql">-- 内联表值函数 CREATE FUNCTION GetUnshippedOrders() RETURNS TABLE AS RETURN SELECT a.SaleId, a.CustomerID, b.Qty FROM Sales.Sales a INNER JOIN Sales.SaleDetail b ON a.SaleId = b.SaleId INNER JOIN Production.Product c ON b.ProductID = c.ProductID WHERE a.ShipDate IS NULL GO -- 多语句表值函数 CREATE FUNCTION GetLastShipped(@CustomerID INT) RETURNS @CustomerOrder TABLE (SaleOrderID INT NOT NULL, CustomerID INT NOT NULL, OrderDate DATETIME NOT NULL, OrderQty INT NOT NULL) AS BEGIN DECLARE @MaxDate DATETIME SELECT @MaxDate = MAX(OrderDate) FROM Sales.SalesOrderHeader WHERE CustomerID = @CustomerID INSERT @CustomerOrder SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty FROM Sales.SalesOrderHeader a INNER JOIN Sales.SalesOrderHeader b ON a.SalesOrderID = b.SalesOrderID INNER JOIN Production.Product c ON b.ProductID = c.ProductID WHERE a.OrderDate = @MaxDate AND a.CustomerID = @CustomerID RETURN END GO</code>
이 예에서 MSTVF는 특정 고객의 마지막 배송 주문을 계산하는 데 사용되며, 이를 위해서는 추가 처리가 필요합니다. ITVF는 배송되지 않은 모든 주문 목록만 검색하면 되며 이는 간단한 필터링 작업에 더 적합합니다.
위 내용은 SQL Server의 인라인 및 다중 문 테이블 반환 함수: 무엇을 선택해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!