OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

SQLヒントを利用する(7.2新機能)

公開日:
更新日:
基本操作
新バージョン/機能
#ヒント

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ヒントを使用しない場合の実行計画

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ヒントを使用した場合の実行計画

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 本記事を公開