PostgreSQLでHINT句が使えるらしい!!
こんばんは。
pg_hint_planというモジュールがリリースされたみたいなので、インストールしてみました!!
----pg_hint_planのドキュメント抜粋----
pg_hint_planの概要
PostgreSQLはコストベースオプティマイザを採用しており、SQL文と統計情報を元に可能なアクセスパスのコストを見積もり、最もコストの低い実行計画を選択します。オプティマイザは可能な限りよい実行計画を作成使用としますが、カラム間の相関関係などは考慮しないため、複雑なクエリでは常に最適なプランが選択されるとは限りません。pg_hint_planを用いると、ヒントを記述したブロックコメントをSQL文の前に加えることで、SQL文やGUCパラメータを変更することなく実行計画を制御することができます。
--------
インストール手順
1.ソースのダウンロード
http://en.sourceforge.jp/projects/pghintplan/releases/
2. tarボールを解凍
$ tar xvzf pg_hint_plan.tar.gz
3.インストール
$ cd pg_hint_plan
$ make USE_PGXS=1 PG_CONFIG=/usr/local/pgsql/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=/usr/local/pgsql/bin/pg_config install
4.pg_hint_planのロード
$ vi $PGDATA/postgresql.conf
(以下を追加)
shared_preload_libraries = 'pg_hint_plan'
5.PostgreSQL再起動
$ pg_ctl restart
waiting for server to shut down.... done
server stopped server starting
$ [2013-02-05 23:49:03.032 JST][00000][19777] LOG: loaded library "pg_hint_plan"
HINT句を使用してみた。
・HINT句を使用しない場合
=# EXPLAIN ANALYZE SELECT * from pgbench_accounts ;
QUERY PLAN -------------------------------------------------------------------------------- -----------------------------------------
Seq Scan on pgbench_accounts (cost=0.00..2640.00 rows=100000 width=97) (actual time=0.026..30.762 rows=100000 loops=1) Total runtime: 46.029 ms (2 rows)
・HINT句使った場合
/*+ IndexScan(pgbench_accounts) */EXPLAIN ANALYZE SELECT * from pgben ch_accounts ; QUERY PLAN
-------------------------------------------------------------------------------- ----------------------------------------------------------
Seq Scan on pgbench_accounts (cost=10000000000.00..10000002640.00 rows=100000 width=97) (actual time=0.034..35.974 rows=100000 loops=1) Total runtime:
インデックスを定義していないため、IndexSCanとならない。(当然であるが)
よく見ると、Seq Scan on pgbench_accountsnの
cost=10000000000となっており、かなり大きな値になっている。
enable_seqscanをoffに設定した場合と同様に、costの値を大きくしているようです。