Though PostgreSQL
provides nonblocking read/write access to table
data, nonblocking read/write access is not currently offered for every
index access method implemented
in PostgreSQL.
The various index types are handled as follows:
B-tree and GiST indexes
Short-term share/exclusive page-level locks are used for
read/write access. Locks are released immediately after each
index row is fetched or inserted. These index types provide
the highest concurrency without deadlock conditions.
Hash indexes
Share/exclusive hash-bucket-level locks are used for read/write
access. Locks are released after the whole bucket is processed.
Bucket-level locks provide better concurrency than index-level
ones, but deadlock is possible since the locks are held longer
than one index operation.
R-tree indexes
Share/exclusive index-level locks are used for read/write access.
Locks are released after the entire command is done.
Currently, B-tree indexes offer the best performance for concurrent
applications; since they also have more features than hash
indexes, they are the recommended index type for concurrent
applications that need to index scalar data. When dealing with
non-scalar data, B-trees are not useful, and GiST indexes should
be used instead. R-tree indexes are deprecated and are likely
to disappear entirely in a future release.