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.
ユニークなセカンダリインデックス
一意のセカンダリインデックスを使用して行にアクセスする場合、これは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プランで一般的に見られる用語のリストです。
... (Last Use) …
スプールファイルは不要になり、このステップが完了すると解放されます。
... with no residual conditions …
該当するすべての条件が行に適用されています。
... END TRANSACTION …
トランザクションロックが解放され、変更がコミットされます。
... eliminating duplicate rows ...
重複する行はスプールファイルにのみ存在し、セットテーブルには存在しません。DISTINCT操作を実行します。
... by way of a traversal of index #n extracting row ids only …
セカンダリインデックス(インデックス#n)で見つかった行IDを含むスプールファイルが作成されます。
... we do a SMS (set manipulation step) …
UNION、MINUS、またはINTERSECT演算子を使用して行を結合します。
... which is redistributed by hash code to all AMPs.
結合に備えてデータを再配布します。
... which is duplicated on all AMPs.
結合の準備として、小さい方のテーブル(SPOOLの観点から)からデータを複製します。
... (one_AMP) or (group_AMPs)
すべてのAMPの代わりに、1つのAMPまたはAMPのサブセットが使用されることを示します。