SQL Server テーブル値関数: MSTVF と ITVF – パフォーマンス分析
SQL Server のマルチステートメント テーブル値関数 (MSTVF) とインライン テーブル値関数 (ITVF) は、表面的には似ていますが、パフォーマンスに大きな違いがあります。 これらの違いを理解することは、クエリのパフォーマンスを最適化するために非常に重要です。
関数の構造と最適化
MSTVF はテーブルを返すストアド プロシージャのように機能しますが、ITVF は本質的に単一の SELECT
ステートメントです。この構造的な違いは、SQL Server クエリ オプティマイザーによるそれらの処理方法に影響します。 ITVF はビューとして扱われるため、オプティマイザは効率的なクエリ計画のためにテーブル統計を利用できます。 逆に、MSTVF はテーブル変数のように動作します。 SELECT
ステートメント全体が実体化され、オプティマイザーによる統計の利用能力が制限されます。
パフォーマンスへの影響: 詳細
ITVF は、一般的に MSTVF よりも優れたパフォーマンスを発揮します。特に、複数の結合とフィルターを含む複雑なクエリにおいて顕著です。 ITVF で統計を効果的に利用するオプティマイザーの機能により、実行時間が短縮されます。この利点は、クエリが複雑になるにつれてより顕著になります。
パラメータ化と最適化のトレードオフ
MSTVF はパラメータ化をサポートしており、動的フィルタリングが可能です。 ただし、この柔軟性には代償が伴います。オプティマイザーは、個別のパラメーター値ごとに関数を繰り返し評価する必要があり、パフォーマンスに影響を与えます。 ITVF にはパラメータ化が欠けており、フィルタリングが必要ない場合はより効率的です。
具体例
前述の MSTVF について考えてみましょう。
<code class="language-sql">CREATE FUNCTION MyNS.GetLastShipped(@CustomerID INT) RETURNS @CustomerOrder TABLE ...</code>
ITVF として書き直す:
<code class="language-sql">CREATE FUNCTION MyNS.GetLastShipped() RETURNS @CustomerOrder TABLE ...</code>
複数の結合を含むクエリでは、オプティマイザーが関数を 1 回呼び出すだけで済むため、一般に ITVF バージョンのパフォーマンスが向上します。
適切な関数タイプの選択
優れたパフォーマンスと単純な構文のため、一般的には ITVF が好まれます。ただし、MSTVF はパラメータ化が必要な状況では依然として価値があります。 最適な選択は、特定のクエリ要件と動的フィルタリングの必要性に完全に依存します。 パフォーマンスのトレードオフを理解することは、情報に基づいた意思決定を行うための鍵となります。
以上がSQL Server の複数ステートメントとインライン テーブル値関数: どちらのパフォーマンスが優れていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。