尼古拉·萨莫赫瓦洛夫:#PostgresMarathon 2-008:LWLock:锁管理器与预处理语句

尼古拉·萨莫赫瓦洛夫:#PostgresMarathon 2-008:LWLock:锁管理器与预处理语句

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

Postgres在执行简单SELECT时,前五次使用自定义计划,锁定表及所有索引。第六次切换到通用计划,但仍锁定所有索引。第七次开始仅锁定表。这是由于规划器锁和执行器锁的机制不同所致。

🎯

关键要点

  • Postgres在执行简单SELECT时,前五次使用自定义计划,锁定表及所有索引。
  • 第六次切换到通用计划,但仍锁定所有索引。
  • 第七次开始仅锁定表,这是由于规划器锁和执行器锁的机制不同所致。
  • 在准备语句的情况下,前五次执行使用自定义计划,锁定所有索引。
  • 第六次执行时,虽然使用了通用计划,但仍然保持了所有索引的锁定。
  • 第七次执行时,使用缓存的通用计划,仅锁定表。
  • PostgreSQL的计划缓存中存在两种不同的锁机制:规划器锁和执行器锁。
  • 规划器锁在查询树中锁定所有潜在的访问路径,而执行器锁仅锁定实际使用的内容。
  • 在第六次执行时,虽然构建了通用计划,但没有进入使用缓存计划的路径,因此仍然保持了规划器锁。
  • 从第七次执行开始,使用缓存的通用计划,执行器锁仅锁定表。

延伸问答

Postgres在执行简单SELECT时,锁定哪些对象?

Postgres在执行简单SELECT时,前五次使用自定义计划,锁定表及所有索引。

为什么第六次执行仍然锁定所有索引?

第六次执行使用了通用计划,但由于仍然保持了规划器锁,因此锁定了所有索引。

第七次执行时Postgres的锁定行为有什么变化?

第七次执行时,Postgres仅锁定表,这是因为使用了缓存的通用计划,执行器锁只锁定实际使用的内容。

PostgreSQL的计划缓存中有哪些锁机制?

PostgreSQL的计划缓存中存在规划器锁和执行器锁,规划器锁锁定所有潜在的访问路径,而执行器锁仅锁定实际使用的内容。

如何通过准备语句来减少锁定?

通过使用准备语句,前五次执行使用自定义计划,之后切换到通用计划,从而减少锁定的数量。

Postgres的计划缓存模式如何影响锁定行为?

当计划缓存模式设置为自动时,前五次执行使用自定义计划,第六次切换到通用计划,影响锁定行为的变化。

➡️

继续阅读