Vertica 7.2からSQLで使用可能なヒントが追加されました。
これまでも、「/*+direct*/」や「/*+label()*/」といったヒントはありましたが、7.2からはヒント句を利用して、JOINの順序や使用するプロジェクションを強制したりできるようになりました。
目次
Vertica 7.2~9.2で利用可能なヒントの一覧
区分 | パラメータ | 説明 |
---|---|---|
General | ALLNODES | EXPLAINで実行計画を参照する際に、あるノードがダウンしている場合であっても、全ノードがアクティブであると仮定した場合の結果を返すよう強制します |
ENABLE_WITH_CLAUSE_MATERIALIZATION | 特定のクエリに対するマテリアライゼーションの有効/無効を設定します | |
EARLY_MATERIALIZATION | 実行対象のクエリに対して、早期にマテリアライゼーションを行います | |
DIRECT | INSERT/MERGE/UPDATE実行時にWOS(メモリ)ではなく、ROS(Disk)に更新します | |
LABEL | クエリを識別するラベルを定義します | |
Join | SYNTACTIC_JOIN | JOINの実行時に、結合の順番をSQLに記述された通りの順番に強制します。また、DISTRIB、JTYPEヒント使用時にも指定する必要があります。 |
GBYTYPE | オプティマイザがGROUP BYを実行するアルゴリズムを指定します。(HASH、またはPIPELINED) | |
DISTRIB | 結合データの配布方法(Local, Broadcast, Resegmenton join key, Filter, Any)を強制します | |
JTYPE | 結合タイプ(Hash結合、またはMerge結合)を強制します | |
UTYPE | UNION ALLの実行方法を指定します | |
Table | PROJS ★ | クエリーで使用するプロジェクションを強制します |
SKIP_PROJS ★ | クエリーで使用しないプロジェクションを強制します | |
Directed query | IGNORECONST | Directedqueryとして保存したクエリにおいて、WHERE句などに指定する値が異なっていても、保存した実行計画で実行するよう強制します。旧バージョンで使用していた実行計画を変えたくない場合等に使用します。 |
VERBATIM | Directedqueryとして保存したクエリにおいて、WHERE句などに指定する値を含めて同じ構文のクエリを実行した場合のみ、保存した実行計画で実行するよう強制します。旧バージョンで使用していた実行計画を変えたくない場合等に使用します。 |
ヒントの使用例
本例ではPROJSヒントを利用して、指定したプロジェクションの利用を強制する例を記載します。PROJSヒントを使用しない場合の実行計画
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
t1テーブルをアンカーテーブルとする、2種類のプロジェクションが存在することを確認 dbadmin=> SELECT owner_name, projection_schema, projection_name, anchor_table_name FROM projections; owner_name | projection_schema | projection_name | anchor_table_name ------------+-------------------+-----------------------+------------------- dbadmin | public | t1_DBD_rep_test_dbd_1 | t1 dbadmin | public | t1_DBD_rep_test_dbd_2 | t1 (2 rows) 実行計画を確認 dbadmin=> EXPLAIN SELECT * FROM t1 ; ------------------------------ QUERY PLAN DESCRIPTION: ------------------------------ EXPLAIN SELECT * FROM t1 ; Access Path: +-STORAGE ACCESS for t1 [Cost: 34, Rows: 3] (PATH ID: 1) | Projection: public.t1_DBD_rep_test_dbd_1★ | Materialize: t1.col2, t1.col1 |
★EXPLAINで実行計画を確認すると、ヒントを使用しない場合は、t1_DBD_rep_test_dbd_1プロジェクションが使用されることが確認できます。
PROJSヒントを使用した場合の実行計画
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dbadmin=> EXPLAIN SELECT * FROM t1 /* +PROJS('t1_DBD_rep_test_dbd_2') */; ※PROJSヒントを使用して「t1_DBD_rep_test_dbd_2」プロジェクションの使用を強制します ------------------------------ QUERY PLAN DESCRIPTION: ------------------------------ EXPLAIN SELECT * FROM t1 /* +PROJS('t1_DBD_rep_test_dbd_2') */; Access Path: +-STORAGE ACCESS for t1 [Cost: 34, Rows: 3] (PATH ID: 1) | Projection: public.t1_DBD_rep_test_dbd_2★ | Materialize: t1.col2, t1.col1 |
★ヒントを使用した場合は、t1_DBD_rep_test_dbd_2プロジェクションが使用されることが確認できます。
検証バージョンについて
この記事の内容はVertica 9.2で確認しています。更新履歴
2019/04/22 ヒント句を追加。検証バージョンを9.2に変更2015/12/15 本記事を公開