pg_hint_plan

description

Pg_hint_plan tweaks planner decisions with user's hints. PostgreSQL executes queries using cost-based optimizer, and sometimes fails to choose most efficient execution plan for technical limitations.

In such cases, pg_hint_plan helps users to guide the planner to choose the plans they want by putting some instructions - call them hints - in the comments prefixed to the SQL statement body. No need to rewrite statement itself nor change some GUC parameters elsewhere.

Functional limitations

Pg_hint_plan's major Functional limitations below.

Hints cannot be used also in ECPG because the comments are not passed to the server.
psql attaches DECLARE statement to the top of existing query string when the FETCH_COUNT variable is a positive value . So, the hints seems dissapearing for pg_hint_plan.

機能の概要

pg_hint_planは、コメント形式でSQLにヒント情報を記述することを可能とします。
SQLにヒントを記述することで、SQL文そのものややGUCパラメータを変えることなく実行計画を制御することが可能になります。

PostgreSQLはコストベースオプティマイザを採用しています。 オプティマイザは可能な限りよい実行計画を作成使用としますが、カラム間の相関関係などは考慮しないため、 複雑なクエリでは常に最適なプランが選択されるとは限りません。

pg_hint_planを用いると、ヒントを記述したブロックコメントをSQL文の前に加えることで、 SQL文やGUCパラメータを変更することなく実行計画を制御することができます。

機能制限

pg_hint_planにはいくつかの機能制限があります。主なものは以下の通り。

ECPGで実装したアプリケーションから発行するクエリは、基本的に実行計画を制御できません。
psqlコマンドのFETCH_COUNT変数に0より大きな整数値を指定すると、pg_hint_planでは実行計画を制御できなくなります。
  1. /*+
  2. HashJoin(a b)
  3. SeqScan(a)
  4. */
  5. EXPLAIN SELECT *
  6. FROM pgbench_branches b
  7. JOIN pgbench_accounts a ON b.bid = a.bid
  8. ORDER BY a.aid;
  9. QUERY PLAN
  10. ---------------------------------------------------------------------------------------
  11. Sort (cost=31465.84..31715.84 rows=100000 width=197)
  12. Sort Key: a.aid
  13. -> Hash Join (cost=1.02..4016.02 rows=100000 width=197)
  14. Hash Cond: (a.bid = b.bid)
  15. -> Seq Scan on pgbench_accounts a (cost=0.00..2640.00 rows=100000 width=97)
  16. -> Hash (cost=1.01..1.01 rows=1 width=100)
  17. -> Seq Scan on pgbench_branches b (cost=0.00..1.01 rows=1 width=100)
  18. (7 rows)

Recent Tickets

regression test using psql and grep2016-04-22 14:16
Hi, \! psql contrib_regression -c "/*+IndexScan(ti1 ti1_pred)*/ EXPLAIN (COSTS true) SELECT * FROM s1.ti1 WHERE...(None)