【问题标题】:Shared Scanning in PostgresPostgres 中的共享扫描
【发布时间】:2020-06-04 02:23:41
【问题描述】:
在 CMU Intro to Databases 课程的11th 讲座中(2020 年 39:37),Andy Pavlo 指出“只有高端数据系统支持共享缓冲区扫描,但 Postgres 和 MySql 不支持”。他没有扩展,因此,我试图找出原因,但找不到任何抽象信息,并想在深入研究文档之前在这里询问。 Andy 的意思是 Postgres 由于其实施而无法支持这一点,还是只是尚未实施?
如果无法实现,那么 Postgres 的设计会阻止它这样做吗?如何避免这种情况?如果可能的话,是什么阻碍了今天的实施?提前致谢。
【问题讨论】:
标签:
postgresql
memory-management
database-design
database-performance
【解决方案1】:
听完演讲后,他会说:
如果我们进行合并连接,我们必须对表进行排序。
现在,如果我们检测到两个查询想要同时对相同的数据进行排序,那么如果查询可以相互捎带,那就太酷了。
高端系统可以做到这一点,但 Postgres 和 MySQL 做不到。
这只是部分正确。
确实,每个想要排序的后端(每个查询)都必须自己这样做,并且没有办法共享排序结果。
但我认为这不是一个非常有价值的功能:
任何两个查询都可能会看到不同版本的数据(想象在两个查询的开头插入一行),因此它们无论如何都无法共享结果。因此,这只能在两个查询想要在大致相同的时间以完全相同的方式对完全相同的一组行进行排序时使用,这似乎是一个过于极端的情况,无法为其添加复杂的功能。由于 PostgreSQL 的多进程架构,在 PostgreSQL 后端之间共享数据很困难。
但是 PostgreSQL 可以 做的是让两个查询共享同一个表的顺序扫描:如果您将 synchronize_seqscans 保留为默认值 @987654322 @,第二个查询想要扫描与已经运行的查询相同的表将只是捎带到正在运行的顺序扫描。这更容易,因为数据在shared_buffers 中,这是一个共享资源。如果您对同一个表进行多次并发顺序扫描,此功能会减少 I/O。