オプティマイザヒント(pg_hint_plan)の基本的な機能内容を説明します。
pg_hint_planの詳細情報については、オープンソース・ソフトウェアのWebページを参照してください。
Symfoware Serverでは、すべてのアプリケーションインタフェースでオプティマイザヒントを指定できます。
機能概要
SQL文ごとに問い合わせ計画を指定できます。
機能一覧
本機能で指定できる主な問い合わせ計画は、以下となります。
問い合わせの方法
ジョインする方法
ジョインする順序
指定された表に対してどのような方法で問い合わせるかを指定します。
主な機能として以下があります。
SeqScan(テーブル名)
BitMapScan(テーブル名 [インデックス名 … ])
IndexScan(テーブル名 [インデックス名 … ])
IndexOnlyScan(テーブル名 [インデックス名 … ])
注意
指定したインデックスが存在しない場合や、指定したインデックスがWHERE句などに指定した検索条件の列に関連しない場合は、“SeqScan”となります。
IndexOnlyScanを指定した場合でも、行が更新されているなどによりテーブルをアクセスする必要がある場合は、“IndexScan”となることがあります。
同じテーブルに複数の問い合わせ方法を指定した場合は、最後の指定が有効となります。
ジョインする方法を指定します。
主な機能として以下があります。
NestLoop(テーブル名 テーブル名 [テーブル名 … ])
MergeJoin(テーブル名 テーブル名 [テーブル名 … ])
HashJoin(テーブル名 テーブル名 [テーブル名 … ])
注意
ビュー表および副問合せには指定できません。
同じテーブルの組み合わせに対して、複数の方法を指定した場合は、最後の指定が有効となります。
指定されたテーブルの順にジョインします。
以下の方法で指定します。
Leading((テーブル テーブル))
[テーブル]の指定方法は以下となります。
テーブル = テーブル名 または ( テーブル テーブル )
注意
同じテーブルの組み合わせに対して、複数の順序を指定した場合は、最後の指定が有効となります。
使用方法
本機能の使用方法を説明します。
本機能を使用するためには、以下の準備が必要となります。
本機能を利用するデータベースに対して、CREATE EXTENSION を実施します。
ここでは、対象のデータベースを“postgres”として説明します。
psqlコマンドを利用して、データベース“postgres”に接続します。
例
Postgres=# CREATE EXTENSION pg_hint_plan; CREATE EXTENSION
参考
今後、新しいデータベースを作成する場合に、デフォルトで本機能が利用できるように、データベース“template1”に対しても同様に本準備作業を実施することを推奨します。
postgresql.confファイルのパラメータを設定します。
パラメータ“shared_preload_libraries”に『pg_hint_plan』を追加します。
Symfoware Serverを再起動します。
『 /*+ ~ */ 』の形式(ブロックコメント)で指定します。
SQL文中に複数のSELECT文が存在する場合などに対して、それぞれのSELECT文にヒント句を指定する場合は、最初のブロックコメント内にすべてのヒント句を記述してください。
例
empテーブルおよびdeptテーブルに対してヒント句を指定
WITH /*+ IndexScan(emp emp_age_index) IndexScan(dept dept_deptno_index) */ age30 AS (SELECT * FROM emp WHERE age BETWEEN 30 AND 39) SELECT * FROM age30, dept WHERE age30.deptno = dept.deptno;
SQL文中の同じオブジェクトに対して、別々のヒント句を指定したい場合は、各オブジェクトに別名を定義し、その別名に対してヒント句を指定してください。
例
empテーブルに対して別々のヒント句を指定
WITH /*+ SeqScan(ta) IndexScan(tb) */ over100 AS (SELECT empno FROM emp ta WHERE salary > 1000000) SELECT * FROM emp tb, over100 WHERE tb.empno = over100.empno AND tb.age < 30
C言語による埋め込みSQLで利用する場合は、ヒント句のブロックコメントの指定位置が制限されます。詳細は“6.4.2 アプリケーションのコンパイル”を参照してください。
使用上の注意
SQL文中の複数のブロックコメントにヒント句を指定した場合、2番目以降のブロックコメントに指定したヒント句は無視されます。
SQL文中のヒント句よりも前に下記に示す文字以外が出現すると、ヒント句のブロックコメントの場合でも無効となります。
空白文字、タブ、改行
アルファベット(大文字・小文字)、数字
アンダースコア、カンマ
括弧: ( )