尽管 PostgreSQL 提供对表数据访问的非阻塞的读/写,但并非所有 PostgreSQL 里实现的索引访问模式都能够进行非阻塞读/写。 不同的索引类型按照下面方法操作∶
短期的共享/排他的页面级的销用于读/写访问。 销在索引行被插入/抓取后立即释放。 B-tree 索引提供了无死锁条件的最高级的并行性。
共享/排他的页面级锁用于读/写访问。锁在命令处理完成后释放。
共享/排他的散列桶级锁用于读/写访问。锁在整个散列桶处理完成后释放。 散列桶级锁比索引级的锁提供了更好的并行性但是可能产生死锁,因为锁持有的时间比一次索引操作时间长。
简单说,B-tree 索引是我们推荐的用于并行应用的索引类型; 因为它们还有比散列索引更多的特性,在那些需要对标量数据进行索引的应用中,我们建议使用这种索引类型。 在处理非标量类型数据的时候,显然不能使用 B-tree;在这种环境下, 应用开发人员应该清醒意识到 GiST 和 R-tree 索引的相对弱的并发性能。