演算子では、SQL Server がクエリまたはデータ操作言語 (DML) ステートメントを実行する方法について説明します。 クエリ オプティマイザーでは、演算子を使用してクエリ プランを作成し、クエリで指定された結果を作成するか、DML ステートメントで指定された操作を実行します。 クエリ プランは、物理演算子で構成されるツリーです。 SET SHOWPLAN ステートメント、SQL Server Management Studio のグラフィカル実行プラン オプション、または SQL Server Profiler Showplan イベント クラスを使用して、クエリ プランを表示できます。
演算子は論理演算子と物理演算子として分類されます。
論理演算子
論理演算子は、ステートメントの処理に使用される関係代数演算を記述します。 つまり、論理演算子は、実行する必要がある操作を概念的に記述します。
物理演算子
物理演算子は、論理演算子によって記述された操作を実装します。 各物理操作は、操作を実行するオブジェクトまたはルーチンです。 たとえば、一部の物理オペレーターは、テーブル、インデックス、またはビューから列または行にアクセスします。 他の物理オペレーターは、計算、集計、データ整合性チェック、結合などの他の操作を実行します。 物理オペレーターにはコストが関連付けられています。
物理演算子は、初期化、データの収集、および終了を行います。 具体的には、物理演算子は次の 3 つのメソッド呼び出しに応答できます。
Init(): Init() メソッドは、物理操作が自身を初期化し、必要なデータ構造を設定します。 物理オペレーターは多くの Init() 呼び出しを受け取る場合がありますが、通常、物理オペレーターは 1 つだけを受け取ります。
GetNext(): GetNext() メソッドは、物理操作がデータの最初または後続の行を取得します。 物理操作は、0 個または多数の GetNext() 呼び出しを受け取ることができます。
Close(): Close() メソッドを使用すると、物理操作で何らかのクリーンアップ操作が実行され、シャットダウンされます。 物理操作は Close() 呼び出しを 1 回だけ受け取ります。
GetNext() メソッドは 1 行のデータを返します。呼び出された回数は、SET STATISTICS PROFILE ON または SET STATISTICS XML ON を使用して生成される Showplan 出力で ActualRows として表示されます。 これらの SET オプションの詳細については、 SET STATISTICS PROFILE (Transact-SQL) および SET STATISTICS XML (Transact-SQL) を参照してください。
Showplan 出力に表示される ActualRebinds と ActualRewinds の数は、 Init() メソッドが呼び出された回数を参照します。 演算子がループ結合の内側にある場合を除き、 ActualRebinds は 1、 ActualRewinds は 0 になります。 演算子がループ結合の内側にある場合、再バインドと巻き戻しの数の合計は、結合の外側で処理された行の数と等しい必要があります。 再バインドとは、結合の相関パラメーターの 1 つ以上が変更され、内部側を再評価する必要があることを意味します。 巻き戻しとは、相関パラメーターが変更されておらず、以前の内部結果セットを再利用できないことを意味します。
ActualRebinds と ActualRewinds は、SET STATISTICS XML ON を使用して生成された XML Showplan 出力に存在します。 これらは、 非クラスター化インデックス スプール、 Remote Query
、 行数スプール、 Sort
、 テーブル スプール、および テーブル値関数 の演算子に対してのみ設定されます。
StartupExpression 属性が TRUE に設定されている場合、ActualRebinds と ActualRewinds は Assert
演算子および Filter 演算子に設定されることがあります。
ActualRebinds と ActualRewinds が XML Showplan に存在する場合、それらは EstimateRebinds および EstimateRewinds に相当します。 存在しない場合、推定行数 (EstimateRows) は実際の行数 (ActualRows) に相当します。 実際のグラフィカルな Showplan 出力では、実際の再バインドおよび実際の巻き戻しがない場合、ゼロが表示されることに注意してください。
関連するカウンター ActualEndOfScans は、SHOWplan 出力が SET STATISTICS XML ON を使用して生成された場合にのみ使用できます。 物理操作がデータ ストリームの末尾に到達するたびに、このカウンターは 1 ずつインクリメントされます。 物理オペレータはデータストリームの末尾に0回、1回、または複数回到達できることがあります。 再バインドと巻き戻しと同様に、演算子がループ結合の内側にある場合にのみ、スキャンの終了数を複数にすることができます。 スキャンの終了回数は、再バインドと巻き戻しの数の合計以下にする必要があります。
物理演算子と論理演算子のマッピング
クエリ オプティマイザーは、論理演算子で構成されるツリーとしてクエリ プランを作成します。 クエリ オプティマイザーは、プランを作成した後、各論理演算子に対して最も効率的な物理操作を選択します。 クエリ オプティマイザーでは、コストベースのアプローチを使用して、論理演算子を実装する物理操作を決定します。
通常、論理操作は複数の物理操作で実装できます。 ただし、まれに、物理操作で複数の論理操作を実装することもできます。
演算子の説明
このセクションでは、論理演算子と物理演算子について説明します。
グラフィカル実行プラン アイコン | Showplan 演算子 | 説明 |
---|---|---|
無し | Aggregate |
Aggregate 演算子は、MIN、MAX、SUM、COUNT、または AVG を含む式を計算します。
Aggregate 演算子には、論理演算子または物理操作を指定できます。 |
![]() |
Arithmetic Expression |
Arithmetic Expression 演算子は、行内の既存の値から新しい値を計算します。
Arithmetic Expression は SQL Server 2014 では使用されません。 |
![]() |
Assert |
Assert 演算子は、条件を検証します。 たとえば、参照整合性を検証したり、スカラー サブクエリから 1 行が返されることを確認したりします。 入力行ごとに、 Assert 演算子は、実行プランの Argument 列の式を評価します。 この式が NULL に評価された場合、行は Assert 演算子を介して渡され、クエリの実行が続行されます。 この式が null 以外の値に評価されると、適切なエラーが発生します。
Assert 演算子は物理操作です。 |
![]() |
Assign |
Assign 演算子は、式または定数の値を変数に割り当てます。
Assign は言語要素です。 |
無し | Asnyc Concat |
Asnyc Concat 演算子は、リモート クエリ (分散クエリ) でのみ使用されます。 これには 、n 個の子ノードと 1 つの親ノードがあります。 通常、一部の子供は、分散クエリに参加するリモートコンピューターです。
Asnyc Concat は、すべての子 open() 同時に呼び出しを行い、各子にビットマップを適用します。 1 のビットごとに、 Async Concat は出力行を要求に応じて親ノードに送信します。 |
![]() |
Bitmap |
SQL Server では、 Bitmap 演算子を使用して、並列クエリ プランでビットマップ フィルター処理を実装します。 ビットマップ フィルターを使用すると、 Parallelism 演算子などの別の演算子を介して行を渡す前に、結合レコードを生成できないキー値を持つ行を削除することで、クエリの実行速度が向上します。 ビットマップ フィルターは、演算子ツリーの一部にあるテーブルの値のセットをコンパクトに表現して、ツリーの別の部分にある 2 番目のテーブルの行をフィルター処理します。 クエリの早い段階で不要な行を削除することで、後続の演算子で操作する行が少なくなり、クエリの全体的なパフォーマンスが向上します。 オプティマイザーは、ビットマップが十分に選択的で役立つと判断した場合、どの演算子にフィルターを適用するかを決定します。
Bitmap は物理操作です。 |
![]() |
Bitmap Create |
Bitmap Create 演算子は、ビットマップが作成されている Showplan 出力に表示されます。
Bitmap Create は論理演算子です。 |
![]() |
Bookmark Lookup |
Bookmark Lookup 演算子は、ブックマーク (行 ID またはクラスタリング キー) を使用して、テーブルまたはクラスター化インデックス内の対応する行を検索します。
Argument 列には、テーブルまたはクラスター化インデックスの行を検索するために使用するブックマーク ラベルが含まれています。
Argument 列には、行が検索されるテーブルまたはクラスター化インデックスの名前も含まれます。 with PREFETCH 句が Argument 列に表示される場合、クエリ プロセッサは、テーブルまたはクラスター化インデックスでブックマークを検索するときに非同期プリフェッチ (先読み) を使用するのが最適であると判断しました。Bookmark Lookup は SQL Server 2014 では使用されません。 代わりに、ブックマーク検索機能を提供 Clustered Index Seek と RID Lookup 。
Key Lookup 演算子もこの機能を提供します。 |
無し | Branch Repartition |
並列クエリ プランでは、反復子の概念領域がある場合があります。 このような領域内のすべての反復子は、並列スレッドによって実行できます。 リージョン自体は、順次実行する必要があります。 個々の領域内の Parallelism 反復子の一部は、 Branch Repartition と呼ばれます。 このような 2 つの領域の境界にある Parallelism 反復子は、 Segment Repartition と呼ばれます。
Branch Repartition と Segment Repartition は論理演算子です。 |
無し | Broadcast |
Broadcast には、1 つの子ノードと n 個の 親ノードがあります。
Broadcast は、入力行をオンデマンドで複数のコンシューマーに送信します。 各コンシューマーは、すべての行を取得します。 たとえば、すべてのコンシューマーがハッシュ結合のビルド側である場合、ハッシュ テーブルの n 個のコピーがビルドされます。 |
![]() |
Build Hash |
xVelocity メモリ最適化列ストア インデックスのバッチ ハッシュ テーブルのビルドを示します。 |
無し | Cache |
Cache は、 Spool 演算子の特殊なバージョンです。 1 行のデータのみが格納されます。
Cache は論理演算子です。
Cache は SQL Server 2014 では使用されません。 |
![]() |
Clustered Index Delete |
Clustered Index Delete 演算子は、クエリ実行プランの引数列で指定されたクラスター化インデックスから行を削除します。 引数列に WHERE:() 述語が存在する場合、述語を満たす行のみが削除されます。
Clustered Index Delete は物理操作です。 |
![]() |
Clustered Index Insert |
Clustered Index Insert Showplan 演算子は、引数列で指定されたクラスター化インデックスに入力から行を挿入します。 引数列には、各列が設定される値を示す SET:() 述語も含まれています。
Clustered Index Insert に挿入値の子がない場合、挿入された行はInsert 演算子自体から取得されます。
Clustered Index Insert は物理操作です。 |
![]() |
クラスター化インデックスのマージ |
Clustered Index Merge 演算子は、マージ データ ストリームをクラスター化インデックスに適用します。 演算子は、演算子の Argument 列に指定されたクラスター化インデックスから行を削除、更新、または挿入します。 実際に実行される操作は、演算子のArgument 列で指定された ACTION 列のランタイム値によって異なります。
クラスター化インデックスのマージ は物理操作です。 |
![]() |
Clustered Index Scan |
Clustered Index Scan 演算子は、クエリ実行プランの Argument 列で指定されたクラスター化インデックスをスキャンします。 オプションの WHERE:() 述語が存在する場合は、述語を満たす行のみが返されます。 引数列に ORDERED 句が含まれている場合、クエリ プロセッサは、クラスター化インデックスが並べ替えた順序で行の出力を返すように要求しました。 ORDERED 句が存在しない場合、ストレージ エンジンは、必ずしも出力を並べ替えることなく、最適な方法でインデックスをスキャンします。
Clustered Index Scan は論理操作と物理操作です。 |
![]() |
Clustered Index Seek |
Clustered Index Seek 演算子は、インデックスのシーク機能を使用して、クラスター化インデックスから行を取得します。
Argument 列には、使用されているクラスター化インデックスの名前と SEEK:() 述語が含まれています。 ストレージ エンジンは、インデックスを使用して、この SEEK:() 述語を満たす行のみを処理します。 また、ストレージ エンジンが SEEK:() 述語を満たすすべての行に対して評価される WHERE:() 述語を含めることもできますが、これは省略可能であり、このプロセスを完了するためにインデックスを使用しません。Argument 列に ORDERED 句が含まれている場合、クエリ プロセッサは、クラスター化インデックスが並べ替えた順序で行を返す必要があると判断しました。 ORDERED 句が存在しない場合、ストレージ エンジンは、必ずしも出力を並べ替えることなく、最適な方法でインデックスを検索します。 出力の順序を保持できるようにすると、並べ替えのない出力を生成するよりも効率が低下する可能性があります。 キーワード LOOKUP が表示されると、ブックマーク検索が実行されます。 SQL Server 2008 以降のバージョンでは、 Key Lookup 演算子はブックマーク参照機能を提供します。
Clustered Index Seek は論理操作と物理操作です。 |
![]() |
Clustered Index Update |
Clustered Index Update 演算子は、Argument 列で指定されたクラスター化インデックスの入力行を更新します。WHERE:() 述語が存在する場合、この述語を満たす行のみが更新されます。 SET:() 述語が存在する場合、更新された各列はこの値に設定されます。 DEFINE:() 述語が存在する場合、この演算子が定義する値が一覧表示されます。 これらの値は、SET 句またはこの演算子内の他の場所、およびこのクエリ内の他の場所で参照できます。
Clustered Index Update は論理操作と物理操作です。 |
![]() |
Collapse |
Collapse 演算子は、更新処理を最適化します。 更新が実行されると、削除と挿入に ( Split 演算子を使用して) 分割できます。
Argument 列には、キー列のリストを指定する GROUP BY:() 句が含まれています。 クエリ プロセッサは、同じキー値を削除して挿入する隣接する行を検出した場合、これらの個別の操作を 1 つのより効率的な更新操作に置き換えます。
Collapse は論理操作と物理操作です。 |
![]() |
Columnstore Index Scan |
Columnstore Index Scan 演算子は、クエリ実行プランのArgument 列で指定された列ストア インデックスをスキャンします。 |
![]() |
Compute Scalar |
Compute Scalar 演算子は、式を評価して計算されたスカラー値を生成します。 その後、ユーザーに返されたり、クエリ内の他の場所で参照されたり、その両方が返されたりする可能性があります。 両方の例は、フィルター述語または結合述語にあります。
Compute Scalar は論理操作と物理操作です。Compute Scalar SET STATISTICS XML によって生成されたプラン表示に表示される演算子には、 RunTimeInformation 要素が含まれていない可能性があります。 SQL Server Management Studio で [実行プランを含める] オプションが選択されている場合、グラフィカル Showplans の[実際の行]、[実際の再バインド]、[実際の再巻き戻し]がプロパティウィンドウに表示されないことがあります。 この場合、これらの演算子はコンパイル済みのクエリ プランで使用されていましたが、実行時クエリ プランの他の演算子によって処理が実行されたことを意味します。 また、SET STATISTICS PROFILE によって生成されるプラン表示出力での実行の数は、SET STATISTICS XML によって生成されたプラン表示での再バインドと巻き戻しの合計と同じであることに注意してください。 |
![]() |
連結 | 連結演算子は複数の入力をスキャンし、スキャンされた各行を返します。 連結 は通常、Transact-SQL UNION ALL コンストラクトを実装するために使用されます。 連結物理操作には、2 つ以上の入力と 1 つの出力があります。 連結は、最初の入力ストリームから出力ストリームに行をコピーし、追加の入力ストリームごとにこの操作を繰り返します。 連結 は論理演算子と物理演算子です。 |
![]() |
Constant Scan |
Constant Scan 演算子は、1 つ以上の定数行をクエリに導入します。
Compute Scalar 演算子は、Constant Scan 演算子によって生成された行に列を追加するために、Constant Scan の後によく使用されます。 |
![]() |
Convert |
Convert 演算子は、スカラー データ型を別のスカラー データ型に変換します。
Convert は言語要素です。 |
無し | Cross Join |
Cross Join 演算子は、最初の (上) 入力の各行と、2 番目の (下部) 入力の各行を結合します。
Cross Join は論理演算子です。 |
![]() |
catchall |
キャッチオール アイコンは、グラフィカルなプラン表示を生成するロジックで反復子に適したアイコンが見つからない場合に表示されます。 キャッチオール アイコンは必ずしもエラー状態を示すわけではありません。 青 (反復子の場合)、オレンジ (カーソルの場合)、緑 (Transact-SQL 言語要素の場合) の 3 つのキャッチオール アイコンがあります。 |
無し | カーソル |
カーソルの論理演算子と物理演算子は、カーソル操作に関連するクエリまたは更新の実行方法を記述するために使用されます。 物理演算子は、カーソルの処理に使用される物理実装アルゴリズムを記述します。たとえば、キーセットドリブン カーソルを使用します。 カーソルを実行する各ステップには、物理操作が含まれます。 論理演算子は、カーソルが読み取り専用など、カーソルのプロパティを記述します。 論理演算子には、非同期、オプティミスティック、プライマリ、読み取り専用、スクロール ロック、セカンダリと同期が含まれます。 物理演算子には、動的、フェッチ クエリ、キーセット、作成クエリ、更新クエリ、スナップショットが含まれます。 |
![]() |
Declare |
Declare 演算子は、クエリ プランにローカル変数を割り当てます。
Declare は言語要素です。 |
![]() |
Delete |
Delete 演算子は、オブジェクトの行の中でArgument 列にある省略可能な述語を満たすものを削除します。 |
![]() |
Deleted Scan |
Deleted Scan 演算子は、トリガー内の削除されたテーブルをスキャンします。 |
無し | Distinct |
Distinct 演算子は、行セットまたは値のコレクションから重複を削除します。
Distinct は論理演算子です。 |
無し | Distinct Sort |
Distinct Sort 論理演算子は入力をスキャンし、重複を削除し、Argument 列の DISTINCT ORDER BY:() 述語で指定された列で並べ替えます。
Distinct Sort は論理演算子です。 |
![]() |
ストリームの配布 |
Distribute Streams 演算子は、並列クエリ プランでのみ使用されます。
Distribute Streams 演算子は、レコードの単一の入力ストリームを受け取り、複数の出力ストリームを生成します。 レコードの内容と形式は変更されません。 入力ストリームの各レコードは、いずれかの出力ストリームに表示されます。 この演算子は、出力ストリーム内の入力レコードの相対順序を自動的に保持します。 通常、ハッシュは、特定の入力レコードがどの出力ストリームに属するかを決定するために使用されます。 出力がパーティション分割されている場合、 Argument 列には PARTITION COLUMNS:() 述語とパーティション分割列が含まれます。
ストリームの分散 は論理演算子です |
![]() |
Dynamic |
Dynamic 演算子は、他のユーザーが行ったすべての変更を表示できるカーソルを使用します。 |
![]() |
積極的スプール |
Eager Spool 演算子は、入力全体を受け取り、各行を、tempdb データベースに格納されている非表示の一時オブジェクトに格納します。 演算子が (たとえば、 Nested Loops 演算子によって) 巻き戻されるが、再バインドが必要ない場合は、入力を再スキャンする代わりにスプール・データが使用されます。 再バインドが必要な場合、スプール・データは破棄され、スプール・オブジェクトは再スキャン (リバインド) 入力によって再作成されます。
Eager Spool 演算子は、"一括" 方式でスプール ファイルをビルドします。スプールの親演算子が最初の行を要求すると、スプール演算子は入力演算子からすべての行を使用し、スプールに格納します。
Eager Spool は論理演算子です。 |
![]() |
Fetch Query |
Fetch Query 演算子は、カーソルに対してフェッチが発行されたときに行を取得します。 |
![]() |
フィルター |
Filter 演算子は入力をスキャンし、Argument 列に表示されるフィルター式 (述語) を満たす行のみを返します。 |
無し | Flow Distinct |
Flow Distinct 論理演算子は入力をスキャンし、重複を削除します。
Distinct 演算子は出力を生成する前にすべての入力を使用しますが、FlowDistinct 演算子は入力から取得された各行を返します (その行が重複している場合を除き、その場合は破棄されます)。 |
無し | Full Outer Join |
Full Outer Join 論理演算子は、2 番目の (下部) 入力の各行と結合された最初の (上) 入力の結合述語を満たす各行を返します。 また、次の行のデータも返されます。-2 番目の入力に一致しなかった最初の入力。 -最初の入力に一致しなかった 2 番目の入力。 一致する値を含まない入力は null 値として返されます。 Full Outer Join は論理演算子です。 |
![]() |
ストリームを集める |
Gather Streams 演算子は、並列クエリ プランでのみ使用されます。
Gather Streams 演算子は、複数の入力ストリームを使用し、入力ストリームを組み合わせてレコードの単一の出力ストリームを生成します。 レコードの内容と形式は変更されません。 この演算子が順序を保持している場合は、すべての入力ストリームを並べ替える必要があります。 出力が順序付けされている場合、 Argument 列には ORDER BY:() 述語と順序付けされる列の名前が含まれます。
Gather Streams は論理演算子です。 |
![]() |
Hash Match |
Hash Match 演算子は、ビルド入力から各行のハッシュ値を計算してハッシュ テーブルを構築します。 ハッシュ値の作成に使用される列のリストを含む HASH:() 述語が、 Argument 列に表示されます。 次に、プローブ行ごとに (該当する場合)、ハッシュ値 (同じハッシュ関数を使用) を計算し、ハッシュ テーブル内で一致するものを検索します。 残差述語が存在する場合 ( Argument 列に RESIDUAL:() で識別されます)、行が一致と見なされるためには、その述語も満たす必要があります。 動作は、実行される論理操作によって異なります。結合の場合は、最初の (上) 入力を使用してハッシュ テーブルを作成し、2 番目の (下部) 入力を使用してハッシュ テーブルをプローブします。 結合の種類によって出力の一致または不一致が決定されます。 複数の結合で同じ結合列が使用されている場合、これらの操作はハッシュ チームにグループ化されます。 個別演算子または集計演算子の場合は、入力を使用してハッシュ テーブルを作成します (重複を削除し、集計式を計算します)。 ハッシュ テーブルが作成されたら、テーブルをスキャンし、すべてのエントリを出力します。 共用体演算子の場合は、最初の入力を使用してハッシュ テーブルを作成します (重複を削除します)。 2 番目の入力 (重複は必要ありません) を使用してハッシュ テーブルをプローブし、一致しないすべての行を返し、ハッシュ テーブルをスキャンしてすべてのエントリを返します。 Hash Match は物理操作です。 |
![]() |
If |
If 演算子は、式に基づいて条件付き処理を実行します。
If は言語要素です。 |
無し | Inner Join |
Inner Join 論理演算子は、最初の (上) 入力と 2 番目の (下部) 入力の結合を満たす各行を返します。 |
![]() |
Insert |
Insert 論理演算子は、入力の各行を、Argument 列で指定されたオブジェクトに挿入します。 物理操作は、 Table Insert 、 Index Insert 、または Clustered Index Insert 演算子です。 |
![]() |
挿入されたスキャン | Inserted Scan 演算子は、挿入されたテーブルをスキャンします。 挿入されたスキャン は、論理操作と物理操作です。 |
![]() |
Intrinsic |
Intrinsic 演算子は、内部 Transact-SQL 関数を呼び出します。
Intrinsic は言語要素です。 |
![]() |
Iterator |
Iterator キャッチオール アイコンは、グラフィカルな Showplans を生成するロジックで反復子に適したアイコンが見つからない場合に表示されます。 キャッチオール アイコンは必ずしもエラー状態を示すわけではありません。 青 (反復子の場合)、オレンジ色 (カーソルの場合)、緑 (Transact-SQL 言語コンストラクトの場合) の 3 つのキャッチオール アイコンがあります。 |
![]() |
Key Lookup |
Key Lookup 演算子は、クラスター化インデックスを持つテーブルに対するブックマーク参照です。
Argument 列には、クラスター化インデックスの名前と、クラスター化インデックスの行の検索に使用されるクラスタリング キーが含まれます。
Key Lookup は常に Nested Loops 演算子を伴います。
Argument 列に WITH PREFETCH 句が表示される場合、クエリ プロセッサは、クラスター化インデックス内のブックマークを検索するときに非同期プリフェッチ (先読み) を使用するのが最適であると判断しました。クエリ プランで Key Lookup 演算子を使用すると、クエリがパフォーマンス チューニングの恩恵を受ける可能性があることを示します。 たとえば、カバーインデックスを追加することでクエリのパフォーマンスが向上する場合があります。 |
![]() |
Keyset |
Keyset 演算子は、更新を表示できるカーソルを使用しますが、他のユーザーによる挿入は表示しません。 |
![]() |
Language Element |
Language Element キャッチオール アイコンは、グラフィカルな Showplans を生成するロジックで反復子に適したアイコンが見つからない場合に表示されます。 キャッチオール アイコンは必ずしもエラー状態を示すわけではありません。 青 (反復子の場合)、オレンジ色 (カーソルの場合)、緑 (Transact-SQL 言語コンストラクトの場合) の 3 つのキャッチオール アイコンがあります。 |
![]() |
怠惰なスプール |
Lazy Spool 論理演算子は、入力の各行を、tempdb データベースに格納されている非表示の一時オブジェクトに格納します。 演算子が (たとえば、 Nested Loops 演算子によって) 巻き戻されるが、再バインドが必要ない場合は、入力を再スキャンする代わりにスプール・データが使用されます。 再バインドが必要な場合、スプール・データは破棄され、スプール・オブジェクトは再スキャン (リバインド) 入力によって再作成されます。
Lazy Spool 演算子は、スプール ファイルを "遅延" 方式でビルドします。つまり、スプールの親演算子が行を要求するたびに、スプール演算子は入力演算子から行を取得し、すべての行を一度に使用するのではなく、スプールに格納します。 Lazy Spool は論理演算子です。 |
無し | Left Anti Semi Join |
Left Anti Semi Join 演算子は、2 番目 (下部) の入力に一致する行がない場合に、最初の (上) 入力から各行を返します。
Argument 列に結合述語が存在しない場合、各行は一致する行になります。
Left Anti Semi Join は論理演算子です。 |
無し | Left Outer Join |
Left Outer Join 演算子は、最初の (上) 入力と 2 番目の (下部) 入力の結合を満たす各行を返します。 最初の入力から、2 番目の入力に一致する行がない行も返されます。 2 番目の入力の不一致行は null 値として返されます。
Argument 列に結合述語が存在しない場合、各行は一致する行になります。
Left Outer Join は論理演算子です。 |
無し | Left Semi Join |
Left Semi Join 演算子は、2 番目 (下部) の入力に一致する行がある場合に、最初の (上) 入力から各行を返します。
Argument 列に結合述語が存在しない場合、各行は一致する行になります。
Left Semi Join は論理演算子です。 |
![]() |
Log Row Scan |
Log Row Scan オペレーターはトランザクション ログをスキャンします。
Log Row Scan は論理操作と物理操作です。 |
![]() |
Merge Interval |
Merge Interval 演算子は、複数の (重複する可能性がある) 間隔をマージして、インデックス エントリのシークに使用される最小の重複しない間隔を生成します。 通常、この演算子は、Constant Scan 演算子に対して 1 つ以上のCompute Scalar 演算子の上に表示されます。この演算子は、この演算子がマージする間隔 (行の列として表されます) を構築します。
Merge Interval は論理操作と物理操作です。 |
![]() |
マージ結合 |
Merge Join 演算子は、内部結合、左外部結合、左半結合、左アンチ半結合、右外部結合、右半結合、右アンチ半結合、集合論理演算を実行します。Argument 列では、マージ結合演算子には、操作が一対多結合を実行している場合はMERGE:()述語が含まれ、操作が多対多結合を実行している場合はMANY-TO-MANY MERGE:()述語が含まれます。
Argument 列には、操作の実行に使用される列のコンマ区切りのリストも含まれています。
マージ結合演算子は、それぞれの列に対して入力をソートする必要があります。これは、クエリプランに明示的なソート操作を挿入することで達成されることがあります。 マージ結合は、明示的な並べ替えが必要ない場合 (たとえば、データベースに適切な B ツリー インデックスがある場合や、マージ結合やロールアップによるグループ化など、複数の操作で並べ替え順序を利用できる場合など) に特に有効です。
マージ結合 は物理操作です。 |
![]() |
Nested Loops |
Nested Loops 演算子は、内部結合、左外部結合、左半結合、および左反半結合論理演算を実行します。 入れ子になったループ結合は、外部テーブルの各行に対して内部テーブルの検索を実行します。通常はインデックスを使用します。 クエリ プロセッサは、予想されるコストに基づいて、内側の入力に対するインデックスの検索の局所性を向上させるために外部入力を並べ替えるかどうかを決定します。
Argument 列の (省略可能な) 述語を満たす行は、実行されている論理操作に基づいて、該当する場合に返されます。
Nested Loops は物理操作です。 |
![]() |
Nonclustered Index Delete |
Nonclustered Index Delete 演算子は、Argument 列で指定された非クラスター化インデックスから入力行を削除します。
Nonclustered Index Delete は物理操作です。 |
![]() |
Index Insert |
Index Insert 演算子は、入力の行を、Argument 列に指定された非クラスター化インデックスに挿入します。
Argument 列には、各列が設定される値を示す SET:() 述語も含まれています。
Index Insert は物理操作です。 |
![]() |
Index Scan |
Index Scan 演算子は、Argument 列で指定された非クラスター化インデックスからすべての行を取得します。 オプションの WHERE:() 述語が Argument 列に表示される場合は、述語を満たす行のみが返されます。
Index Scan は論理操作と物理操作です。 |
![]() |
Index Seek |
Index Seek 演算子は、インデックスのシーク機能を使用して、非クラスター化インデックスから行を取得します。
Argument 列には、使用されている非クラスター化インデックスの名前が含まれています。 SEEK:() 述語も含まれています。 ストレージ エンジンは、インデックスを使用して SEEK:() 述語を満たす行のみを処理します。 必要に応じて WHERE:() 述語を含めることができます。この述語は、ストレージ エンジンが SEEK:() 述語を満たすすべての行に対して評価されます (これを行うためにインデックスを使用しません)。
Argument 列に ORDERED 句が含まれている場合、クエリ プロセッサは、非クラスター化インデックスが並べ替えた順序で行を返す必要があると判断しました。 ORDERED 句が存在しない場合、ストレージ エンジンは最適な方法でインデックスを検索します (出力が並べ替えられるという保証はありません)。 出力の順序を保持できるようにすることは、並べ替えのない出力を生成するよりも効率が低い場合があります。
Index Seek は論理操作と物理操作です。 |
![]() |
Index Spool |
Index Spool 物理操作には、Argument 列に SEEK:() 述語が含まれています。
Index Spool 演算子は入力行をスキャンし、各行のコピーを非表示のスプール ファイル (tempdb データベースに格納され、クエリの有効期間中のみ既存) に配置し、行に非クラスター化インデックスを作成します。 これにより、インデックスのシーク機能を使用して、SEEK:() 述語を満たす行のみを出力できます。 演算子が (たとえば、 Nested Loops 演算子によって) 巻き戻されるが、再バインドが必要ない場合は、入力を再スキャンする代わりにスプール・データが使用されます。 |
![]() |
Nonclustered Index Update |
Nonclustered Index Update 物理操作は、Argument 列で指定された非クラスター化インデックスの入力から行を更新します。 SET:() 述語が存在する場合、更新された各列はこの値に設定されます。
Nonclustered Index Update は物理操作です。 |
![]() |
オンライン インデックスの挿入 | オンライン インデックス挿入物理操作は、インデックスの作成、変更、または削除操作がオンラインで実行されることを示します。 つまり、基になるテーブル データは、インデックス操作中にユーザーが引き続き使用できます。 |
無し | Parallelism |
Parallelism 演算子は、ストリームの分散、ストリームの収集、ストリームの再パーティション分割の論理操作を実行します。
Argument 列には、パーティション分割される列をコンマで区切ったリストを含むPARTITION COLUMNS:()述語を含めることができます。
Argument 列には ORDER BY:() 述語を含め、パーティション分割中の並べ替え順序を保持する列を一覧表示することもできます。
Parallelism は物理操作です。注: クエリが並列クエリとしてコンパイルされていても、実行時にシリアル クエリとして実行される場合、SET STATISTICS XML または SQL Server Management Studio の [実際の実行プランを含める] オプションを使用して生成されたプラン表示出力には、 Parallelism 演算子のRunTimeInformation 要素は含まれません。 SET STATISTICS PROFILE 出力では、実際の行数と実際の実行数は、 Parallelism 演算子のゼロを表示します。 いずれかの条件が発生した場合、 Parallelism 演算子はクエリのコンパイル中にのみ使用され、実行時クエリ プランでは使用されなかったことを意味します。 サーバーに高い同時負荷がある場合、並列クエリ プランがシリアルで実行される場合があることに注意してください。 |
![]() |
Parameter Table Scan |
Parameter Table Scan 演算子は、現在のクエリでパラメーターとして機能するテーブルをスキャンします。 通常、これはストアド プロシージャ内の INSERT クエリに使用されます。
Parameter Table Scan は論理操作と物理操作です。 |
無し | 部分集計 |
部分集計 は、並列プランで使用されます。 可能な限り多くの入力行に集計関数を適用するため、ディスクへの書き込み ("スピル" と呼ばれます) は必要ありません。
Hash Match は、パーティション集計を実装する唯一の物理演算子 (反復子) です。
部分集計 は論理演算子です。 |
![]() |
Population Query |
Population Query 演算子は、カーソルを開いたときにカーソルの作業テーブルを設定します。 |
![]() |
Refresh Query |
Refresh Query 演算子は、フェッチ バッファー内の行の現在のデータをフェッチします。 |
![]() |
Remote Delete |
Remote Delete 演算子は、リモート オブジェクトから入力行を削除します。
Remote Delete は論理操作と物理操作です。 |
![]() |
リモート インデックス スキャン | Remote Index Scan 演算子は、[引数] 列に指定されたリモート インデックスをスキャンします。 リモート インデックス スキャン は、論理操作および物理操作です。 |
![]() |
Remote Index Seek |
Remote Index Seek 演算子は、リモート インデックス オブジェクトのシーク機能を使用して行を取得します。
Argument 列には、使用されているリモート インデックスの名前と SEEK:() 述語が含まれています。
リモート インデックス シーク は論理物理操作です。 |
![]() |
リモート挿入 | Remote Insert 演算子は、入力行をリモート オブジェクトに挿入します。 リモート挿入 は論理操作および物理操作です。 |
![]() |
Remote Query |
Remote Query 演算子は、リモート ソースにクエリを送信します。 リモート サーバーに送信されたクエリのテキストが Argument 列に表示されます。
Remote Query は論理操作と物理操作です。 |
![]() |
Remote Scan |
Remote Scan 演算子は、リモート オブジェクトをスキャンします。 リモート オブジェクトの名前が Argument 列に表示されます。
Remote Scan は論理操作と物理操作です。 |
![]() |
Remote Update |
Remote Update 演算子は、リモート オブジェクトの入力行を更新します。
Remote Update は論理操作と物理操作です。 |
![]() |
ストリームの再分割 |
Repartition Streams 演算子は、複数のストリームを使用し、複数のレコード ストリームを生成します。 レコードの内容と形式は変更されません。 クエリ オプティマイザーでビットマップ フィルターを使用する場合、出力ストリーム内の行数が減ります。 入力ストリームの各レコードは、1 つの出力ストリームに配置されます。 この演算子が順序を保持している場合は、すべての入力ストリームを並べ替え、複数の順序付けされた出力ストリームにマージする必要があります。 出力がパーティション分割されている場合、 Argument 列には PARTITION COLUMNS:() 述語とパーティション分割列が含まれます。出力が順序付けされている場合、 Argument 列には ORDER BY:() 述語と順序付けされる列が含まれます。
再パーティションストリーム は論理演算子です。 この演算子は、並列クエリ プランでのみ使用されます。 |
![]() |
Result |
Result 演算子は、クエリ プランの最後に返されるデータです。 これは通常、ショープランのルート要素です。
Result は言語要素です。 |
![]() |
RID Lookup |
RID Lookup は、指定された行識別子 (RID) を使用するヒープのブックマーク参照です。
Argument 列には、テーブル内の行を検索するために使用されるブックマーク ラベルと、その行が検索されるテーブルの名前が含まれます。
RID Lookup は常に入れ子になったループ結合を伴います。
RID Lookup は物理操作です。 ブックマーク参照の詳細については、MSDN SQL Server ブログの「ブックマーク検索」を参照してください。 |
無し | Right Anti Semi Join |
Right Anti Semi Join 演算子は、最初の (上) 入力の一致する行が存在しない場合に、2 番目 (下部) の入力から各行を出力します。 一致する行は、 Argument 列の述語を満たす行として定義されます (述語が存在しない場合、各行は一致する行です)。
Right Anti Semi Join は論理演算子です。 |
無し | Right Outer Join |
Right Outer Join 演算子は、2 番目 (下部) の入力と、最初の (上) 入力の一致する各行の結合を満たす各行を返します。 2 番目の入力から、最初の入力に一致する行がない行も、NULLと結合して返されます。
Argument 列に結合述語が存在しない場合、各行は一致する行になります。
Right Outer Join は論理演算子です。 |
無し | Right Semi Join |
Right Semi Join 演算子は、最初の (上) 入力に一致する行がある場合、2 番目 (下部) の入力から各行を返します。
Argument 列に結合述語が存在しない場合、各行は一致する行になります。
Right Semi Join は論理演算子です。 |
![]() |
行数カウントスプール |
行数スプール演算子は入力をスキャンし、存在する行数をカウントし、データを含まない同じ数の行を返します。 この演算子は、行に含まれるデータではなく、行の存在を確認することが重要な場合に使用されます。 たとえば、 Nested Loops 演算子が左半結合操作を実行し、結合述語が内部入力に適用される場合、 Nested Loops 演算子の内部入力の先頭に行カウント スプールを配置できます。 次に、 Nested Loops 演算子は、外部行を返すかどうかを判断するために、行数スプールによって出力される行の数を決定できます (内部側からの実際のデータは必要ないため)。
行数スプール は物理演算子です。 |
![]() |
セグメント | セグメント は、物理操作と論理操作です。 入力セットは、1 つ以上の列の値に基づいてセグメントに分割されます。 これらの列は、 Segment 演算子の引数として表示されます。 その後、演算子は一度に 1 つのセグメントを出力します。 |
無し | Segment Repartition |
並列クエリ プランでは、反復子の概念領域がある場合があります。 このような領域内のすべての反復子は、並列スレッドによって実行できます。 リージョン自体は、順次実行する必要があります。 個々の領域内の Parallelism 反復子の一部は、 Branch Repartition と呼ばれます。 このような 2 つの領域の境界にある Parallelism 反復子は、 Segment Repartition と呼ばれます。
Branch Repartition と Segment Repartition は論理演算子です。 |
![]() |
Sequence |
Sequence オペレーターは、広範な更新計画を推進します。 機能的には、各入力を順番 (上から下) で実行します。 通常、各入力は異なるオブジェクトの更新です。 最後の (下部) 入力から取得された行のみが返されます。
Sequence は論理操作と物理操作です。 |
![]() |
Sequence Project |
Sequence Project 演算子は、順序付けられたセットに対して計算を実行する列を追加します。 入力セットは、1 つ以上の列の値に基づいてセグメントに分割されます。 その後、演算子は一度に 1 つのセグメントを出力します。 これらの列は、 Sequence Project 演算子の引数として表示されます。
Sequence Project は論理操作と物理操作です。 |
![]() |
スナップショット | Snapshot 演算子は、他のユーザーによる変更を表示しないカーソルを作成します。 |
![]() |
Sort |
Sort 演算子は、すべての受信行を並べ替えます。
Argument 列には、この操作によって重複が削除された場合は DISTINCT ORDER BY:() 述語か、並べ替えられる列のコンマ区切りリストを含む ORDER BY:() 述語が含まれます。 列が昇順で並べ替えられる場合は、列の先頭に ASC が付きます。列が降順に並べ替えられている場合は値 DESC が付きます。
Sort は論理操作と物理操作です。 |
![]() |
Split |
Split 演算子は、更新処理を最適化するために使用されます。 各更新操作が削除操作と挿入操作に分割されます。
Split は論理操作と物理操作です。 |
![]() |
スプール |
Spool 演算子は、中間クエリ結果をtempdb データベースに保存します。 |
![]() |
Stream Aggregate |
Stream Aggregate 演算子は、1 つ以上の列で行をグループ化し、クエリによって返される 1 つ以上の集計式を計算します。 この演算子の出力は、クエリ内の後の演算子によって参照されるか、クライアントに返されるか、またはその両方で参照できます。
Stream Aggregate 演算子には、そのグループ内の列で並べ替えられた入力が必要です。 オプティマイザーは、前のSort 演算子または順序付けられたインデックスシークまたはスキャンのためにデータがまだ並べ替えされていない場合、この演算子の前にSort 演算子を使用します。 SQL Server Management Studio の SHOWPLAN_ALL ステートメントまたはグラフィカル実行プランでは、GROUP BY 述語の列が Argument 列に一覧表示され、集計式が [定義済みの値 ] 列に一覧表示されます。
Stream Aggregate は物理操作です。 |
![]() |
スイッチ | Switch は、 n 個の入力を持つ特殊な連結反復子です。 式は、各 Switch 演算子に関連付けられています。 式の戻り値 (0 ~ n- 1) に応じて、 Switch は適切な入力ストリームを出力ストリームにコピーします。 Switch の 1 つの用途は、TOP 演算子などの特定の演算子で高速前方カーソルを含むクエリ プランを実装することです。 スイッチ は論理操作と物理操作の両方です。 |
![]() |
Table Delete |
Table Delete 物理操作は、クエリ実行プランのArgument 列で指定されたテーブルから行を削除します。 |
![]() |
Table Insert |
Table Insert 演算子は、クエリ実行プランのArgument 列に指定されたテーブルに入力から行を挿入します。
Argument 列には、各列が設定される値を示す SET:() 述語も含まれています。
Table Insert に挿入値の子がない場合、挿入された行は Insert 演算子自体から取得されます。
Table Insert は物理操作です。 |
![]() |
テーブルのマージ |
Table Merge 演算子は、マージ データ ストリームをヒープに適用します。 演算子は、演算子の Argument 列に指定されたテーブル内の行を削除、更新、または挿入します。 実行される実際の操作は、演算子のArgument 列に指定された ACTION 列の実行時値によって異なります。
テーブルのマージ は物理操作です。 |
![]() |
Table Scan |
Table Scan 演算子は、クエリ実行プランのArgument 列で指定されたテーブルからすべての行を取得します。 where:() 述語が Argument 列に表示される場合は、述語を満たす行のみが返されます。
Table Scan は論理操作と物理操作です。 |
![]() |
テーブル スプール |
Table Spool 演算子は、入力をスキャンし、tempdb データベースに格納され、クエリの有効期間中のみ既存の非表示のスプール テーブルに各行のコピーを配置します。 演算子が (たとえば、 Nested Loops 演算子によって) 巻き戻されるが、再バインドが必要ない場合は、入力を再スキャンする代わりにスプール・データが使用されます。
テーブル スプール は物理操作です。 |
![]() |
Table Update |
Table Update 物理オペレーターは、クエリ実行プランの Argument 列に指定されたテーブルの入力行を更新します。 SET:() 述語は、更新された各列の値を決定します。 これらの値は、SET 句またはこの演算子内の他の場所、およびこのクエリ内の他の場所で参照できます。 |
![]() |
テーブル値関数 |
テーブル値関数演算子は、テーブル値関数 (Transact-SQL または CLR) を評価し、結果の行を tempdb データベースに格納します。 親反復子が行を要求すると、Table 値関数はtempdb から行を返します。テーブル値関数を呼び出すクエリでは、 テーブル値関数 反復子を使用してクエリ プランが生成されます。 テーブル値関数は 、さまざまなパラメーター値で評価できます。 テーブル値関数 XML リーダーは 、XML BLOB をパラメーターとして入力し、XML ノードを XML ドキュメントの順序で表す行セットを生成します。 その他の入力パラメーターでは、XML ドキュメントのサブセットに返される XML ノードが制限される場合があります。 XPath フィルターを使用したテーブル値関数 XML リーダーは、XPath 式を満たす XML ノードに出力を制限する特殊な種類の XML リーダー テーブル値関数 です。 テーブル値関数 は、論理および物理操作です。 |
![]() |
トップ |
Top 演算子は入力をスキャンし、場合によっては並べ替え順序に基づいて、最初に指定された行数または行の割合のみを返します。
Argument 列には、重複やリンクがあるか確認するための列のリストを含めることができます。 更新計画では、 Top 演算子を使用して行数の制限を適用します。
Top は論理操作と物理操作です。
Top は論理操作と物理操作です。 |
無し | 上位 N 個の並べ替え |
上位 N 個の並べ替えは 、 Sort 反復子に似ていますが、最初の N 行のみが必要であり、結果セット全体は必要ありません。
N の小さい値の場合、SQL Server クエリ実行エンジンはメモリ内で並べ替え操作全体の実行を試みます。
N の値が大きい場合、クエリ実行エンジンは、N がパラメーターではない一般的な並べ替え方法に頼ります。 |
![]() |
UDX |
拡張演算子 (UDX) は、SQL Server で多数の XQuery および XPath 操作の 1 つを実装します。 すべての UDX 演算子は、論理演算子と物理演算子の両方です。 拡張演算子 (UDX) FOR XML は、入力するリレーショナル行セットを 1 つの出力行の 1 つの BLOB 列の XML 表現にシリアル化するために使用されます。 順序に依存する XML 集計演算子です。拡張演算子 (UDX) XML SERIALIZER は、順序に依存する XML 集計演算子です。 XML ノードまたは XQuery スカラーを表す行を XML ドキュメント順に入力し、シリアル化された XML BLOB を 1 つの出力行の 1 つの XML 列に生成します。拡張演算子 (UDX) XML FRAGMENT SERIALIZER は、XQuery 挿入データ変更拡張機能に挿入される XML フラグメントを表す入力行の処理に使用される特殊な種類の XML SERIALIZER です。拡張演算子 (UDX) XQUERY STRING は、XML ノードを表す入力行の XQuery 文字列値を評価します。 順序に依存する文字列集計演算子です。 入力の文字列値を含む XQuery スカラーを表す列を含む 1 つの行を出力します。拡張演算子 (UDX) XQUERY LIST DECOMPOSER は、XQuery リスト分解演算子です。 XML ノードを表す入力行ごとに、入力が XSD リスト型の場合、リスト要素値を含む XQuery スカラーを表す 1 つ以上の行が生成されます。拡張演算子 (UDX) XQUERY DATA は、XML ノードを表す入力の XQuery fn:data() 関数を評価します。 順序に依存する文字列集計演算子です。
fn:data()の結果を含む XQuery スカラーを表す列を含む 1 つの行を出力します。拡張演算子 XQUERY CONTAINS は、XML ノードを表す入力の XQuery fn:contains() 関数を評価します。 順序に依存する文字列集計演算子です。
fn:contains()の結果を含む XQuery スカラーを表す列を含む 1 つの行を出力します。拡張演算子 UPDATE XML NODE 、XML 型の modify() メソッドの XQuery replace データ変更拡張機能の XML ノードを更新します。 |
無し | 連合 | Union 演算子は複数の入力をスキャンし、スキャンされた各行を出力し、重複を削除します。 合併 は論理演算子です。 |
![]() |
Update |
Update 演算子は、クエリ実行プランのArgument 列に指定されたオブジェクトの入力から各行を更新します。
Update は論理演算子です。 物理オペレーターは、 Table Update 、 Index Update 、または Clustered Index Update です。 |
![]() |
While |
While 演算子は、Transact-SQL while ループを実装します。
While は言語要素です |
![]() |
Window Spool |
Window Spool 演算子は、関連付けられているウィンドウを表す行のセットに各行を展開します。 クエリでは、OVER 句によってクエリ結果セット内のウィンドウが定義され、ウィンドウ関数によってウィンドウ内の各行の値が計算されます。
Window Spool は論理操作と物理操作です。 |