Teradata-explain

提供:Dev Guides
移動先:案内検索

Teradata-説明

EXPLAINコマンドは、解析エンジンの実行計画を英語で返します。 別のEXPLAINコマンドを除き、任意のSQLステートメントで使用できます。 クエリの前にEXPLAINコマンドを使用すると、解析エンジンの実行計画がAMPではなくユーザーに返されます。

EXPLAINの例

次の定義を持つテーブルEmployeeを考えます。

CREATE SET TABLE EMPLOYEE,FALLBACK (
   EmployeeNo INTEGER,
   FirstName VARCHAR(30),
   LastName VARCHAR(30),
   DOB DATE FORMAT 'YYYY-MM-DD',
   JoinedDate DATE FORMAT 'YYYY-MM-DD',
   DepartmentNo BYTEINT
)
UNIQUE PRIMARY INDEX ( EmployeeNo );

EXPLAINプランの例を以下に示します。

全表スキャン(FTS)

SELECTステートメントで条件が指定されていない場合、オプティマイザーは、テーブルのすべての行にアクセスするフルテーブルスキャンの使用を選択できます。

以下は、オプティマイザーがFTSを選択できるサンプルクエリです。

EXPLAIN SELECT *FROM employee;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のように、オプティマイザーはすべてのAMPおよびAMP内のすべての行にアクセスすることを選択します。

1) First, we lock a distinct TDUSER."pseudo table" for read on a
   RowHash to prevent global deadlock for TDUSER.employee.
2) Next, we lock TDUSER.employee for read.
3) We do an all-AMPs RETRIEVE step from TDUSER.employee by way of an
   all-rows scan with no residual conditions into Spool 1
   (group_amps), which is built locally on the AMPs.  The size of
   Spool 1 is estimated with low confidence to be 2 rows (116 bytes).
   The estimated time for this step is 0.03 seconds.
4) Finally, we send out an END TRANSACTION step to all AMPs involved
   in processing the request.
→ The contents of Spool 1 are sent back to the user as the result of
   statement 1.  The total estimated time is 0.03 seconds.

一意のプライマリインデックス

一意のプライマリインデックスを使用して行にアクセスする場合、1つのAMP操作です。

EXPLAIN SELECT* FROM employee WHERE EmployeeNo = 101;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のとおり、これは単一のAMP検索であり、オプティマイザーは一意のプライマリインデックスを使用して行にアクセスしています。

1) First, we do a single-AMP RETRIEVE step from TDUSER.employee by
   way of the unique primary index "TDUSER.employee.EmployeeNo = 101"
   with no residual conditions. The estimated time for this step is
   0.01 seconds.
→ The row is sent directly back to the user as the result of
   statement 1.  The total estimated time is 0.01 seconds.

一意のセカンダリインデックス

Unique Secondary Indexを使用して行にアクセスすると、2アンペアの操作になります。

次の定義を持つテーブルSalaryを検討してください。

CREATE SET TABLE SALARY,FALLBACK (
   EmployeeNo INTEGER,
   Gross INTEGER,
   Deduction INTEGER,
   NetPay INTEGER
)
PRIMARY INDEX ( EmployeeNo )
UNIQUE INDEX (EmployeeNo);

次のSELECTステートメントを検討してください。

EXPLAIN SELECT * FROM Salary WHERE EmployeeNo = 101;

上記のクエリを実行すると、次の出力が生成されます。 ご覧のように、オプティマイザーは一意のセカンダリインデックスを使用して2アンペアで行を取得します。

1) First, we do a two-AMP RETRIEVE step from TDUSER.Salary
   by way of unique index # 4 "TDUSER.Salary.EmployeeNo =
   101" with no residual conditions.  The estimated time for this
   step is 0.01 seconds.
→ The row is sent directly back to the user as the result of
   statement 1.  The total estimated time is 0.01 seconds.

追加規約

以下は、EXPLAINプランで一般的に見られる用語のリストです。

  1. (最後の使用)…*

スプールファイルは不要になり、この手順が完了すると解放されます。

  1. 残留条件なし…*

すべての適用可能な条件が行に適用されています。

  1. トランザクションの終了… *

トランザクションロックが解除され、変更がコミットされます。

  1. 重複行の削除…​*

重複行はスプールファイルにのみ存在し、テーブルは設定されません。 DISTINCT操作を実行します。

  1. 行IDのみを抽出するインデックス#nのトラバーサルによって…*

セカンダリインデックス(インデックス#n)で見つかった行IDを含むスプールファイルが構築されます

  1. SMS(セット操作ステップ)を行います…*

UNION、MINUS、またはINTERSECT演算子を使用して行を結合します。

  1. ハッシュコードによってすべてのAMPに再配布されます。*

結合の準備のためにデータを再配布します。

  1. すべてのAMPで複製されます。*

結合の準備として、より小さなテーブルのデータを(SPOOLの観点から)複製します。

  1. (one_AMP)または(group_AMPs)*

すべてのAMPの代わりに1つのAMPまたはAMPのサブセットが使用されることを示します。