Postgresql 中文操作指南

13.7. Locking and Indexes #

虽然 PostgreSQL 提供了对表数据的非阻塞读/写访问,但当前不会为 PostgreSQL 中实现的每个索引访问方法提供非阻塞读/写访问。各种索引类型处理方式如下:

  • B-tree、GiST 和 SP-GiST 索引

    • 对读/写访问使用短期共享/独占页面级锁。在获取或插入每一行索引后会立即释放锁。这些索引类型提供最高并发性,且没有死锁情况。

  • Hash indexes

    • 对读/写访问使用共享/独占散列桶级锁。在处理完整个桶后释放锁。桶级锁提供的并发性比索引级锁更好,但由于锁保持的时间比一个索引操作的时间长,因此可能出现死锁。

  • GIN indexes

    • 短期共享/独占页面级锁用于读/写访问。锁在获取或插入每一行索引后立即释放。但请注意,插入一个 GIN 索引值通常会对每一行生成多个索引键插入,因此 GIN 可能为一个值的插入执行大量工作。

当前,B 树索引为并发应用程序提供最佳性能;它们还具有比哈希索引更多功能,因此它们是需要为标量数据编制索引的并发应用程序推荐的索引类型。在处理非标量数据时,B 树不起作用,而应改用 Gist、SP-Gist 或 GIN 索引。