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

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

B-treeインデックス

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

GiST および R-Tree インデックス

読み込み/書き込みアクセスに共有/排他モードのインデックスレベルロックを使います。 ロックは、コマンドの処理完了後に解放されます。

ハッシュインデックス

読み込み/書き込みアクセスに共有/排他モードのページレベルロックを使います。 ロックは、そのページが処理された後に解放されます。 ページレベルロックは、インデックスレベルのロックよりも同時実行性に優れていますが、デッドロックに陥りやすくなります。

まとめると、B-treeインデックスは同時実行アプリケーションにおいて最善の性能を提供します。 これはまた、ハッシュインデックスよりも多くの機能を持つため、スカラデータのインデックスが必要な同時実行アプリケーションで推奨するインデックス型です。 非スカラデータを扱う場合、B-treeを使用することができないことは明確です。 この場合、アプリケーション開発者は、GistとR-treeインデックスは同時実行性能が相対的に低いことに注意しなければなりません。