PostgreSQL で インデックス・オンリー・スキャン

PostgreSQL でも 9.2 から インデックス・オンリー・スキャンが使えるようになっています。

この機能は データを取得する際に、インデックスだけで事足りる場合は インデックスのみを使用するというものです。 Oracle では昔からありましたが PostgreSQL では 9.2 から実装されました。

通常は、検索にインデックスを使用しても、テーブルからデータを取得するために 別の領域(ヒープ)を読みに行くわけですが、これが不要になるためパフォーマンスの向上に かなり期待できる部分があります。

ただ、PostgreSQLは追記型のデータベースなので インデックスだけでは 古いデータかどうか判断できないため、インデックス・オンリー・スキャンの実装は 難しいとされていました。 これを 8.4 でバキュームのため?に追加された ビジビリティマップ というデータを使って「インデックスだけで大丈夫か」を判断しているそうです。

なので、インデックス・オンリー・スキャンといっても、場合によってはテーブルのデータを読みに行く必要があります。 更新が多いテーブルでは難しいかもしれません。

三焦経だけでもありがたいですし、ビジビリティマップが綺麗に?なるようにバキュームも重要です。

実行計画を見ると次のようになります。
( field1 がテーブルの主キー)

psql=# EXPLAIN
psql-# SELECT field1 FROM table1
psql-# WHERE field1 > 300000

Index Only Scan using table1_pkey on table1  (cost=0.43..
  Index Cond: (field1 > 300000)

Index Only Scan と出力されます。

Google サイト内検索

Amazonアソシエイト