Vertica 7.2から、任意のクエリの実行計画を保存する「Directed Query」という機能が追加されました。
Directed Queryの利用方法
Directed Queryには「DIRECTED QUERY CUSTOM」と「DIRECTED QUERY OPTIMIZER」の2種類があります。
DIRECTED QUERY CUSTOM
SQLヒントを利用すると、使用するプロジェクションや結合タイプを強制できますが、このときの実行計画を「DIRECTED QUERY CUSTOM」を使用してVertica内に保存できます。実行計画を保存すると、次回以降はSQLヒントを使用せずにクエリを実行しても、SQLヒント使用時と同じ実行計画で処理が行われます。
例えば「SQLヒントを利用したいが、アプリケーション側でクエリの書き換えは行いたくない」といった場合は本機能が便利です。
使用手順
1. SAVE QUERYコマンドを実行します。このとき、実行計画を保存したいクエリにはまだヒント句は付与しないようにします。
dbadmin=> SAVE QUERY <実行計画を保存したいクエリ> ;2. CREATE DIRECTED QUERY CUSTOMコマンドを実行します。このとき、実行計画を保存したいクエリにはヒント句を付与してください。
dbadmin=> CREATE DIRECTED QUERY CUSTOM '任意の実行計画名' <ヒント句付の実行計画を保存したいクエリ> ;3. ACTIVATE DIRECTED QUERYコマンドで作成したDIRECTED QUERYを有効にします。
dbadmin=> ACTIVATE DIRECTED QUERY '手順2で指定した実行計画名' ;以降は手順1で指定したクエリを実行すると、手順2で保存した実行計画でクエリが処理されるようになります。
例)t1_DBD_BBBBプロジェクションを使用する実行計画を保存する場合
1. 以下のクエリを実行した場合、デフォルトではt1_DBD_AAAAプロジェクションが使用されます。
dbadmin=> EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
------------------------------
QUERY PLAN DESCRIPTION:
------------------------------
EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
Access Path:
+-STORAGE ACCESS for t1 [Cost: 10, Rows: 1] (PATH ID: 1)
| Projection: aa.t1_DBD_AAAA ★
| Materialize: t1.col1, t1.col2
| Filter: (t1.col1 = 2)2. ヒント句なしの該当のクエリを指定してSAVE QUERYコマンドを実行します。
dbadmin=> SAVE QUERY SELECT * FROM t1 WHERE col1 = 2;
SAVE QUERY3. t1_DBD_AAAAプロジェクションではなく、t1_DBD_BBBBプロジェクションの使用を強制するヒント句を付与したクエリの実行計画をt1_optという名前で保存します。
dbadmin=> CREATE DIRECTED QUERY CUSTOM 't1_opt' SELECT * from t1 /*+ PROJS(t1_DBD_BBBB) */ where col1 = 2;
CREATE DIRECTED QUERY4. 保存したt1_optを有効化します。
dbadmin=> ACTIVATE DIRECTED QUERY 't1_opt';
ACTIVATE DIRECTED QUERY5. 該当クエリをヒント句なしで実行してもt1_DBD_BBBBプロジェクションが使用されるようになりました。
dbadmin=> EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
------------------------------
QUERY PLAN DESCRIPTION:
------------------------------
EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
The following active directed query(query name: t1_opt) is being executed:
SELECT t1.col1, t1.col2 FROM aa.t1/*+PROJS('t1_DBD_BBBB')*/ WHERE (t1.col1 = 2)
Access Path:
+-STORAGE ACCESS for t1 [Cost: 34, Rows: 1] (PATH ID: 1)
| Projection: aa.t1_DBD_BBBB ★
| Materialize: t1.col1, t1.col2
| Filter: (t1.col1 = 2)DIRECTED QUERY OPTIMIZER
DIRECTED QUERY OPTIMIZERを使用すると、オプティマイザが生成したした実行計画を保存しておくことができます。
例えば、Verticaをバージョンアップすると、同じクエリでも実行計画が変更になる可能性があります。このときにバージョンアップ後も旧バージョンの実行計画を使いたいといった場合は本機能が便利です。
使用手順
1. CREATE DIRECTED QUERY OPTIMEERコマンドを実行します。本機能はオプティマイザが決定した実行計画を保存しておく機能のため、クエリにはヒント句を付与しません。
dbadmin=> CREATE DIRECTED QUERY OPTIMEER '任意の実行計画名' <実行計画を保存したいクエリ> ;2. ACTIVATE DIRECTED QUERYコマンドで作成したDIRECTED QUERYを有効にします。
dbadmin=> ACTIVATE DIRECTED QUERY '手順1で指定した実行計画名' ;例)「SELECT * from t1 where col1 = 2」の実行計画を保存する場合
1. 「SELECT * from t1 where col1 = 2」の実行計画をt1_optという名前で保存します。
dbadmin=> CREATE DIRECTED QUERY OPTIMIZER 't1_opt' SELECT * from t1 where col1 = 2;
CREATE DIRECTED QUERY2. ACTIVATE DIRECTED QUERYコマンドで作成したDIRECTED QUERYを有効にします。
dbadmin=> ACTIVATE DIRECTED QUERY 't1_opt';
ACTIVATE DIRECTED QUERY3. 該当クエリを実行すると、手順1で保存した実行計画が使用されるようになりました。
dbadmin=> EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
------------------------------
QUERY PLAN DESCRIPTION:
------------------------------
EXPLAIN SELECT * FROM t1 WHERE col1 = 2;
The following active directed query(query name: t1_opt) is being executed:
SELECT /*+verbatim*/ t1.col1, t1.col2 FROM aa.t1 t1/*+projs('aa.t1_DBD_AAAA')*/ WHERE
(t1.col1 = 2)
Access Path:
+-STORAGE ACCESS for t1 [Cost: 10, Rows: 1] (PATH ID: 1)
| Projection: aa.t1_DBD_AAAA
| Materialize: t1.col1, t1.col2
| Filter: (t1.col1 = 2)参考情報
SQLヒントを利用する(7.2新機能)
https://www.ashisuto.co.jp/cm/analytics-database/sql_hint_7-2.html
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。