ユーザ定義のインデックスアドバイザは、C関数で書いておく。そうすると、EXPLAIN実行時にそれが呼び出され、EXPLAINの表示が拡張される。本家のメーリングリストに投稿された例を示す。
regression=# explain select * from fooey order by unique2,unique1;
QUERY PLAN
-----------------------------------------------------------------
Sort (cost=809.39..834.39 rows=10000 width=8)
Sort Key: unique2, unique1
-> Seq Scan on fooey (cost=0.00..145.00 rows=10000 width=8)
(3 rows)
最初はインデックスが設定されていないので、順スキャンになる。
regression=# explain select * from fooey where unique2 in (1,2,3);
QUERY PLAN
-------------------------------------------------------
Seq Scan on fooey (cost=0.00..182.50 rows=3 width=8)
Filter: (unique2 = ANY ('{1,2,3}'::integer[]))
(2 rows)
regression=# load '/home/tgl/pgsql/advisor';
LOAD
ユーザ定義のインデックスアドバイザをロードする。
regression=# explain select * from fooey order by unique2,unique1;
QUERY PLAN
----------------------------------------------------------------------------------------
Sort (cost=809.39..834.39 rows=10000 width=8)
Sort Key: unique2, unique1
-> Seq Scan on fooey (cost=0.00..145.00 rows=10000 width=8)
Plan with hypothetical indexes:
Index Scan using on fooey (cost=0.00..376.00 rows=10000 width=8)
(6 rows)
もう一度EXPLAINを実行すると、順スキャンのプランのほかに、インデックスを使ったプランが表示されるようになる。ここで「Plan with hypothetical indexes」と「hypothetical index」は、ユーザ定義インデックスアドバイザが設定した文字列である。
これはあまり親切な表示ではないが、それでも仮にインデックスがあれば、インデックスを使ったより良いプランを作成できることがわかる。