PostgreSQL 中的并发查询 - 实际发生了啥?

Posted

技术标签:

【中文标题】PostgreSQL 中的并发查询 - 实际发生了啥?【英文标题】:Concurrent queries in PostgreSQL - what is actually happening?PostgreSQL 中的并发查询 - 实际发生了什么? 【发布时间】:2020-02-13 10:58:13 【问题描述】:

假设我们有两个用户对 PostgreSQL 中的同一个表运行查询。所以,

用户 1:SELECT * FROM table WHERE year = '2020'

用户 2:SELECT * FROM table WHERE year = '2019'

它们会同时执行而不是一个接一个地执行吗?

我希望如果我有 2 个处理器,我可以同时运行这两个处理器。但我认为,鉴于数据所在的位置(例如磁盘)是同一张表,是否存在分区、配置、事务等,事情会变得更加复杂。有人可以帮助我了解如何确保就 PostgreSQL 而言,我得到了我想要的行为?在什么情况下我会得到我想要的行为,在什么情况下我不会?

编辑:我发现另一个问题与我所问的非常接近 - https://dba.stackexchange.com/questions/72325/postgresql-if-i-run-multiple-queries-concurrently-under-what-circumstances-wo。它有点旧,没有太多答案,希望对它有新的看法。

【问题讨论】:

【参考方案1】:

如果两个用户有两个独立的连接并且他们没有竭尽全力互相阻止,那么查询将同时执行。如果他们需要同时访问同一个缓冲区,或者同时将同一个磁盘页面读入一个缓冲区,他们将使用非常快速的锁定/协调方法(LWLocks、自旋锁或像 CAS 之类的原子操作)来协调那。确切的技术因版本而异,因为更好的方法在受支持的平台上广泛可用,并且人们找到时间更改实现以使用这些更好的方法。

就 PostgreSQL 而言,我可以确保获得我想要的行为吗?

您应该始终获得查询的正确答案(或者如果您使用最高(非默认)隔离级别,则可能会出现某种错误,表明序列化失败,但这似乎没有风险如果这些查询中的每一个都在单语句事务中运行。)

我认为你想多了。使用数据库管理系统的意义在于您不需要对其进行微观管理。

此外,“并行查询”是指使用多个 CPU 的单个查询,而不是同时运行的不同查询。

【讨论】:

我对微观管理方面特别感兴趣,因为我正在学习系统的内部结构。并行查询是“inter-”和“intra-”查询并行性的总称,因此它既可以指使用多个 CPU 的单个查询,也可以指同时运行的多个查询。 我发现另一个问题与我所问的非常接近 - dba.stackexchange.com/questions/72325/…。但是,它有点旧,没有太多答案,希望对它有新的看法。你能帮忙吗?

以上是关于PostgreSQL 中的并发查询 - 实际发生了啥?的主要内容,如果未能解决你的问题,请参考以下文章

PosegreSQL基础回顾(第 13 章 并发控制)

PosegreSQL基础回顾(第 13 章 并发控制)

奇怪的postgresql查询

优化在 pgAdmin 中执行速度比在应用程序中更快的 postgresql 查询以及并发查询

无法使用 knex.js 中的连接复制 PostgresQL 查询

关于postgresql中事务隔离的总结