Postgres 中的共享扫描

Shared Scanning in Postgres

在 CMU 数据库入门课程(2020 年,39:37)的 11th 讲座中,Andy Pavlo 指出 "only the high end data systems support shared buffer scanning but Postgres and MySql cannot"。他没有展开,因此,我试图找出原因,但找不到任何抽象信息,想在进入文档之前先在这里问一下。 Andy 的意思是 Postgres 不能支持它,因为它的实现,或者只是还没有实现?

如果无法实现,Postgres 的设计如何阻止它实现?如何规避这种情况?如果可能的话,是什么阻碍了今天的实施?提前致谢。

听演讲,他说了这样的话:

If we do a merge join, we have got to sort the tables. Now if we detect that two queries want to sort the same data at the same time, it would be cool if the queries could piggy-back onto each other. The high-end systems can do that, but Postgres and MySQL cannot.

这只是部分正确。

确实每个后端(每个查询)想要排序都必须自己做,而且没有办法共享排序结果。

但我认为这不是一个非常有价值的功能:

任何两个查询都可能会看到不同版本的数据(想象一下在两个查询的开头之间插入一行),因此它们无论如何都无法共享结果。因此,只有当两个查询想要在大约相同的时间以完全相同的方式对完全相同的一组行进行排序时,才可以使用此方法,这似乎是一种极端情况,无法为其添加复杂的功能。由于 PostgreSQL 的多进程架构,在 PostgreSQL 后端之间共享数据很困难。

但是 PostgreSQL 可以 做的(这里说话者是错误的)是让两个查询共享同一个 table 的顺序扫描:如果你离开 synchronize_seqscans 在其默认值 on 下,第二个查询想要扫描与已经 运行 相同的 table 查询将仅搭载到 运行 顺序扫描。这更容易,因为数据在 shared_buffers 中,这是一个共享资源。如果您对同一 table.

进行多次并发顺序扫描,则此功能会减少 I/O