Postgresql Postgres中的共享扫描

Postgresql Postgres中的共享扫描,postgresql,memory-management,database-design,database-performance,Postgresql,Memory Management,Database Design,Database Performance,在CMU数据库入门课程(2020,39:37)的讲座中,Andy Pavlo指出“只有高端数据系统支持共享缓冲区扫描,但Postgres和MySql不能”。他没有展开,因此,我试图找出原因,但找不到任何抽象的信息,在我深入文档之前想在这里提问。Andy的意思是说Postgres因为它的实现而不能支持它,还是说它还没有实现 如果它无法实现,那么Postgres的设计会阻止它实现吗?如何才能避免这种情况?如果可能,是什么阻碍了今天的实施?提前谢谢 听演讲时,他说了这样的话: 如果我们进行合并联接,就

在CMU数据库入门课程(2020,39:37)的讲座中,Andy Pavlo指出“只有高端数据系统支持共享缓冲区扫描,但Postgres和MySql不能”。他没有展开,因此,我试图找出原因,但找不到任何抽象的信息,在我深入文档之前想在这里提问。Andy的意思是说Postgres因为它的实现而不能支持它,还是说它还没有实现


如果它无法实现,那么Postgres的设计会阻止它实现吗?如何才能避免这种情况?如果可能,是什么阻碍了今天的实施?提前谢谢

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

如果我们进行合并联接,就必须对表进行排序。 现在,如果我们检测到两个查询想要同时对相同的数据进行排序,那么如果查询能够相互依赖,那就太酷了。 高端系统可以做到这一点,但Postgres和MySQL不行

这只是部分正确

确实,每个想要排序的后端(每个查询)都必须自己进行排序,并且无法共享排序结果

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

任何两个查询都可能会看到不同版本的数据(假设在两个查询的开头插入一行),因此它们无论如何都无法共享结果。因此,只有当两个查询希望在几乎相同的时间以完全相同的方式对完全相同的行集进行排序时,才可以使用该方法,这似乎是一个很复杂的情况,无法为其添加复杂的特征。由于PostgreSQL的多进程体系结构,在PostgreSQL后端之间共享数据非常困难


但是PostgreSQL所能做的(这里说话人是错的)是让两个查询共享同一个表的顺序扫描:如果将
synchronize\u seqscans
的默认值设置为
on
,则第二个要扫描与已经运行的查询相同的表的查询只会占用正在运行的顺序扫描。这更容易,因为数据位于
共享缓冲区中,这是一种共享资源。如果您对同一个表进行多个并发顺序扫描,此功能将减少I/O。

这是一个非常棒的答案,我完全明白您的观点。非常感谢。