ページの先頭行へ戻る
Symfoware Server V12.1.0 アプリケーション開発ガイド
FUJITSU Software

11.1.1 オプティマイザヒント

オプティマイザヒント(pg_hint_plan)の基本的な機能内容を説明します。

pg_hint_planの詳細情報については、オープンソース・ソフトウェアのWebページを参照してください。

Symfoware Serverでは、すべてのアプリケーションインタフェースでオプティマイザヒントを指定できます。

機能概要

SQL文ごとに問い合わせ計画を指定できます。

機能一覧

本機能で指定できる主な問い合わせ計画は、以下となります。

問い合わせの方法

指定された表に対してどのような方法で問い合わせるかを指定します。

主な機能として以下があります。

  • SeqScan(テーブル名)

  • BitMapScan(テーブル名 [インデックス名 … ])

  • IndexScan(テーブル名 [インデックス名 … ])

  • IndexOnlyScan(テーブル名 [インデックス名 … ])

注意

  • 指定したインデックスが存在しない場合や、指定したインデックスがWHERE句などに指定した検索条件の列に関連しない場合は、“SeqScan”となります。

  • IndexOnlyScanを指定した場合でも、行が更新されているなどによりテーブルをアクセスする必要がある場合は、“IndexScan”となることがあります。

  • 同じテーブルに複数の問い合わせ方法を指定した場合は、最後の指定が有効となります。


ジョインする方法

ジョインする方法を指定します。

主な機能として以下があります。

  • NestLoop(テーブル名 テーブル名 [テーブル名 … ])

  • MergeJoin(テーブル名 テーブル名 [テーブル名 … ])

  • HashJoin(テーブル名 テーブル名 [テーブル名 … ])

注意

  • ビュー表および副問合せには指定できません。

  • 同じテーブルの組み合わせに対して、複数の方法を指定した場合は、最後の指定が有効となります。


ジョインする順序

指定されたテーブルの順にジョインします。

以下の方法で指定します。

  • Leading((テーブル テーブル))

    [テーブル]の指定方法は以下となります。

    テーブル = テーブル名 または ( テーブル テーブル )

注意

同じテーブルの組み合わせに対して、複数の順序を指定した場合は、最後の指定が有効となります。

使用方法

本機能の使用方法を説明します。


準備

本機能を使用するためには、以下の準備が必要となります。

  1. 本機能を利用するデータベースに対して、CREATE EXTENSION を実施します。
    ここでは、対象のデータベースを“postgres”として説明します。
    psqlコマンドを利用して、データベース“postgres”に接続します。

    Postgres=# CREATE EXTENSION pg_hint_plan;
    CREATE EXTENSION

    参考

    今後、新しいデータベースを作成する場合に、デフォルトで本機能が利用できるように、データベース“template1”に対しても同様に本準備作業を実施することを推奨します。

  2. postgresql.confファイルのパラメータを設定します。
    パラメータ“shared_preload_libraries”に『pg_hint_plan』を追加します。

  3. 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 アプリケーションのコンパイル”を参照してください。

使用上の注意