ホームページ >データベース >mysql チュートリアル >SQL Server のインライン関数と複数ステートメントのテーブル値関数: どちらを選択するべきですか?

SQL Server のインライン関数と複数ステートメントのテーブル値関数: どちらを選択するべきですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-12 19:12:42680ブラウズ

Inline vs. Multi-Statement Table-Valued Functions in SQL Server: Which Should You Choose?

SQL Server テーブル値関数: インライン関数と複数ステートメント関数の比較

SQL Server のテーブル値関数 (TVF) を使用すると、単一の関数呼び出しから複数行のデータを返すことができます。ただし、TVF は主に、マルチステートメント関数とインライン関数の 2 種類に分類されます。

インライン テーブル値関数 (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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。