Marlock Homes Diary

備忘録。忘れないように書きます。

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の値を大きくしているようです。