12.5. ロックとインデックス

PostgreSQLは、テーブルデータへのノンブロック読み込み/書き込みアクセスを備えています。しかし現在、この機能はPostgreSQLで実装されている全てのインデックスアクセスメソッドに対して実装されているわけではありません。 各種のインデックスでは下記のように扱われます。

B-treeインデックスおよびGiSTインデックス

読み込み/書き込みアクセスに短期の共有/排他モードのページレベルロックを使います。 ロックは、インデックス行が挿入または取り出されるとただちに解放されます。 これらのインデックス種類は、デッドロック状態になることなく、最も高い同時実行性を提供します。

ハッシュインデックス

読み込み/書き込みアクセスに共有/排他モードのハッシュバケットレベルロックを使います。 ロックは、バケット全体が処理された後に解放されます。 バケットレベルロックは、インデックスレベルのロックよりも同時実行性に優れていますが、1つのインデックス操作よりも長くロックが保持されますので、デッドロックに陥りやすくなります。

GINインデックス

読み込み/書き込みアクセスに短期の共有/排他モードのページレベルロックを使います。 ロックは、インデックス行が挿入または取り出されるとただちに解放されます。 しかし、GINによりインデックス付けされた値の挿入は、通常1行当たり複数のインデックスキーの挿入をもたらすことに注意してください。 そのため、GINは単一の値を挿入する時に更に多くの作業を行います。

現時点では、B-treeインデックスは同時実行アプリケーションにおいて最善の性能を提供します。 これはまた、ハッシュインデックスよりも多くの機能を持つため、スカラデータのインデックスが必要な同時実行アプリケーションで推奨するインデックス型です。 非スカラデータを扱う場合、B-treeを使用することができないことは明確です。 この場合は代わりにGiSTインデックスもしくはGINインデックスを使用すべきです。