PostgreSQL-如果同时运行多个查询,在什么情况下会加速?在什么情况下我会看到速度下降?


10

作为一个不是DBA的人,我会谦虚地对待你们,我敢肯定,我的问题充满了概念上的缺陷,并且“取决于”地雷。我也很确定,所有选择回答的人都希望在细节方面超出我目前的能力。

也就是说,我总体上对以下情况感到好奇:

  • 假设我有两个非平凡的查询。
  • 查询1平均需要2分钟才能完成。
  • 查询2平均需要5分钟才能完成。

如果我连续运行它们,一个接一个地运行,那么我预计平均需要7分钟才能完成。这合理吗?

不仅如此,如果同时运行两个查询该怎么办?同时两个独立的连接。

  • 我希望在什么情况下看到加速?(总时间<7分钟)
  • 我预计在什么情况下会放缓?(总时间> 7分钟)

现在,如果我有1000个非平凡查询并发运行,我预感它将导致整体速度下降。在这种情况下,瓶颈可能在哪里?处理器?内存?开车吗

同样,我知道在不知道具体细节(我没有)的情况下,可能无法完全回答问题。我正在寻找一些一般性准则,以便在询问以下问题时考虑:

  • 在什么情况下并发查询会导致整体加速?
  • 在什么情况下并发查询会导致整体速度下降?

Answers:


14

如果我连续运行它们,一个接一个地运行,那么我预计平均需要7分钟才能完成。这合理吗?

如果他们使用不相关的数据集,则可以。

如果他们共享一个数据集,并且第一个查询的缓存很冷并且该查询主要是受I / O绑定的,那么第二个查询可能会立即完成。在处理性能分析和查询时间时,需要考虑缓存的影响。

不仅如此,如果同时运行两个查询该怎么办?同时两个独立的连接。

“这取决于”。

如果它们都使用同一张表的顺序扫描,那么在PostgreSQL中,由于它支持同步顺序扫描,因此在性能上将是巨大的胜利。

如果他们共享相同的索引,那么他们很可能会受益于彼此的读取缓存。

如果它们是独立的并且处理不同的数据,则它们可能会争夺I / O带宽,在这种情况下,它们可能花费与顺序运行相同的时间。如果I / O子系统受益于并发(更多客户端具有更高的净吞吐量),则总时间可能更少。如果I / O子系统处理并发性较差,则它们可能比顺序运行它们需要更长的时间。否则它们可能根本就不受I / O约束,在这种情况下,如果每个处理器都有一个可用的CPU,它们就可以很好地执行,就好像另一个处理器根本没有运行一样。

它在很大程度上取决于硬件和系统配置,数据集以及查询本身。

现在,如果我有1000个非平凡查询并发运行,我预感它将导致整体速度下降。在这种情况下,瓶颈可能在哪里?处理器?内存?开车吗

是的,由于多种原因,这很可能会减慢速度。

  • PostgreSQL自己在进程间协调,事务和锁管理,缓冲区管理等方面的开销。这可能是一笔不小的开销,并且PostgreSQL并不是真正为高客户数量而设计的- 如果您将工作排队,它会更好

  • 对工作内存,缓存等的竞争

  • 操作系统调度开销,因为它需要1000个竞争进程来处理所有需要的时间片。这些天,现代OS具有很少的调度程序。

  • I / O颠簸。大多数I / O系统的客户端性能都达到峰值。有时是1,即最好只有一个客户,但通常更高。有时性能会再次降低到阈值以上。有时它只是达到平稳状态。


这正是我所寻找的解释。清晰,简洁,内容丰富。谢谢!
亚伦·约翰逊

@Craig Ringer,您好,如果我将在一个表(2亿行)上同时运行1000个查询,该怎么办。Postgres会很好地处理它们吗?同步顺序扫描有帮助吗?
拉胡尔·豪塔姆

@RahulGautam请提供有关新问题的详细信息,以及指向该问题的链接。
Craig Ringer


@RahulGautam您的链接已死。我想知道您是否可以提供最新情况?这是一个非常有趣的话题。
Zeruno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.