ユーザ定義のインデックスアドバイザは、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」は、ユーザ定義インデックスアドバイザが設定した文字列である。

これはあまり親切な表示ではないが、それでも仮にインデックスがあれば、インデックスを使ったより良いプランを作成できることがわかる。