ホームページ >データベース >mysql チュートリアル >SQL Server のインライン関数と複数ステートメントのテーブル値関数: どちらを選択するべきですか?
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 サイトの他の関連記事を参照してください。