尽管 PostgreSQL 提供了对表数据的非阻塞读/写访问,但 PostgreSQL 中实现的每个索引访问方法当前都不提供非阻塞读/写访问。各种索引类型处理方式如下
短期共享/独占页面级锁用于读/写访问。在获取或插入每行索引后立即释放锁。这些索引类型提供了最高并发性,且没有死锁条件。
共享/独占哈希桶级锁用于读/写访问。在处理完整个桶后释放锁。桶级锁比索引级锁提供了更好的并发性,但由于锁比一个索引操作保持的时间更长,因此可能会发生死锁。
短期共享/独占页面级锁用于读/写访问。在获取或插入每行索引后立即释放锁。但请注意,插入 GIN 索引的值通常会为每行生成多个索引键插入,因此 GIN 可能对单个值插入执行大量工作。
目前,B 树索引为并发应用程序提供了最佳性能;由于它们还具有比哈希索引更多的功能,因此它们是需要对标量数据建立索引的并发应用程序的推荐索引类型。在处理非标量数据时,B 树没有用,而应改用 GiST、SP-GiST 或 GIN 索引。