論理操作と物理操作のリファレンス

操作は、SQL Server でクエリやデータ操作言語 (DML) ステートメントを実行する方法を示します。クエリ オプティマイザでは、操作を使用して、クエリで指定された結果を作成するクエリ プラン、または DML ステートメントで指定された操作を実行するクエリ プランが構築されます。クエリ プランは、物理操作をツリー構成で表現したものです。

操作は、論理操作と物理操作に分類されます。論理操作は、概念レベルでのリレーショナル クエリ処理操作を示します。物理操作では、論理操作で定義された操作が、具体的な方法またはアルゴリズムを使用して実際に実装されます。たとえば、join は論理操作で、nested loops joins は物理操作です。

  • 論理操作
    論理操作は、ステートメントの処理に使用される関係代数操作を表します。つまり、論理操作は、どのような操作を実行する必要があるかを、概念的に示します。

  • 物理操作
    物理操作では、論理操作によって示される操作が実装されます。それぞれの物理操作は、操作を実行するオブジェクトまたはルーチンです。たとえば、一部の物理操作は、テーブル、インデックス、またはビューから、列や行にアクセスします。他の物理操作は、他の種類の操作を実行します。たとえば、Aggregate 操作は、MIN、MAX、SUM、COUNT、または AVG を含む式を計算し、Merge Join 操作は、さまざまな種類の論理結合操作を実行します。

    物理操作では、初期化、データの収集が行われた後に終了されます。具体的には、物理操作は次の 3 つのメソッド呼び出しに応答できます。

    • Init(): Init() メソッドは、物理操作自体を初期化し、必要なデータ構造を設定します。通常、物理操作が受け取る Init() 呼び出しは 1 つだけですが、多くの Init() 呼び出しを受け取る場合もあります。

    • GetNext(): GetNext() メソッドにより、物理操作がデータの最初の行または後続の行を取得します。物理操作が受け取る GetNext() 呼び出しは、多数の場合もゼロの場合もあります。

    • Close(): Close() メソッドにより、物理操作はクリーンアップ操作を実行し、物理操作自体がシャットダウンされます。物理操作は、Close() 呼び出しを 1 つだけ受け取ります。

GetNext() メソッドは、データ行を 1 行返します。このメソッドが呼び出された回数は、SET STATISTICS PROFILE ON または SET STATISTICS XML ON を使用して生成されるプラン表示出力で ActualRows として表示されます。これらの SET オプションの詳細については、「SET STATISTICS PROFILE (Transact-SQL)」および「SET STATISTICS XML (Transact-SQL)」を参照してください。

プラン表示出力に表示される ActualRebinds および ActualRewinds の数は、Init() メソッドが呼び出された回数を示します。ループ結合内部での操作でなければ、ActualRebinds は 1、ActualRewinds は 0 になります。ループ結合内部での操作の場合、再バインドと巻き戻しの合計数は、結合外部で処理された行数に等しくなる必要があります。再バインドとは、結合の変更された相関パラメータと、内側部分の相関パラメータの 1 つ以上を再評価する必要があることを意味します。巻き戻しとは、変更された相関パラメータを使用せず、前の内部の結果セットを再利用することを意味します。

ActualRebinds および ActualRewinds は、SET STATISTICS XML ON を使用して生成された XML プラン表示出力に存在します。これらは、Nonclustered Index SpoolRemote QueryRow Count SpoolSortTable Spool、および Table-valued Function の各操作に対してのみ作成されます。また、ActualRebinds および ActualRewinds は、StartupExpression 属性が TRUE に設定されると、Assert 操作と Filter 操作に対しても作成される場合があります。

ActualRebinds および ActualRewinds が XML プラン表示に存在する場合、これらの値が EstimateRebinds および EstimateRewinds に相当します。存在しない場合、予測行数 (EstimateRows) が実際の行数 (ActualRows) に相当します。この場合、実際のグラフィカルなプラン表示出力では、実際の再バインド数と実際の巻き戻し数としてゼロが表示されることに注意してください。グラフィカルなプラン表示の詳細については、「グラフィカル実行プランの表示 (SQL Server Management Studio)」を参照してください。

関連するカウンタ ActualEndOfScans は、プラン表示出力が SET STATISTICS XML ON を使用して生成されている場合のみ使用できます。物理操作がデータ ストリームの最後に達するたびに、このカウンタの値は 1 ずつ増加します。物理操作がデータ ストリームの最後に達することのできる回数は、0 回、1 回、あるいは複数回です。再バインドおよび巻き戻しと同様に、スキャンの終了回数は、ループ結合内部での操作の場合のみ 2 回以上になります。スキャンの終了回数は、再バインドおよび巻き戻しの合計数以下になる必要があります。

物理操作は、実行アルゴリズムに相当します。物理操作の例には、index scan、index seek、nested loop join、merge join、hash join、hash aggregation、stream aggregation などがあります。物理操作には、それぞれ関連するコストがかかります。クエリや DML ステートメントの実行の各手順には、それぞれ物理操作が必要になります。

物理操作と論理操作の対応関係

クエリ オプティマイザでは、ツリー構成の論理操作としてクエリ プランが作成されます。クエリ オプティマイザでは、プランが作成されると、各論理操作にとって最も効率的な物理操作が選択されます。クエリ オプティマイザでは、論理操作をどの物理操作から実装するかを判断するために、コストベースの手法が使用されます。

通常、複数の物理操作で 1 つの論理操作を実装できます。ただし、めったにないケースですが、1 つの物理操作で複数の論理操作を実装することもできます。

このセクションの内容

このセクションには、次の論理操作と物理操作の説明が含まれています。

Aggregate

Merge Interval

Arithmetic Expression

Merge Join

Assert

Nested Loops

Assign

Nonclustered Index Delete

Async Concat

Nonclustered Index Insert

Bitmap

Nonclustered Index Scan

Bitmap Create

Nonclustered Index Seek

Bookmark Lookup

Nonclustered Index Spool

Branch Repartition

Nonclustered Index Update

Broadcast

Online Index Insert

Cache

Parallelism

Clustered Index Delete

Parameter Table Scan

Clustered Index Insert

Partial Aggregate

Clustered Index Merge

Population Query

Clustered Index Scan

Refresh Query

Clustered Index Seek

Remote Delete

Clustered Index Update

Remote Index Scan

Collapse

Remote Index Seek

Compute Scalar

Remote Insert

Concatenation

Remote Query

Constant Scan

Remote Scan

Convert

Remote Update

Cross Join

Repartition Streams

Cursor Catchall

Result

Declare

RID Lookup

Delete

Right Anti Semi Join

Deleted Scan

Right Outer Join

Distinct

Right Semi Join

Distinct Sort

Row Count Spool

Distribute Streams

Segment

Dynamic

Segment Repartition

Eager Spool

Sequence

Fetch Query

SequenceProject

Filter

Snapshot

Flow Distinct

Sort

Full Outer Join

Split

Gather Streams

Spool

Hash Match

Stream Aggregate

Hash Match Root

Switch

Hash Match Team

Table Delete

If

Table Insert

Inner Join

Table Merge

Insert

Table Scan

Inserted Scan

Table Spool

Intrinsic

Table Update

Iterator Catchall

Table-Valued Function

Key Lookup

Top

Keyset

Top N Sort

Language Element Catchall

UDX

Lazy Spool

Union

Left Anti Semi Join

Update

Left Outer Join

While

Left Semi Join

カーソル論理操作とカーソル物理操作

Log Row Scan