Postgres中的共享扫描

问题描述 投票:0回答:1

[在CMU数据库入门课程(2020,39:37)的11th讲座中,Andy Pavlo指出“只有高端数据系统支持共享缓冲区扫描,而Postgres和MySql无法。”他没有扩展,因此,我试图找出原因,但找不到任何抽象信息,因此想在进入文档之前在这里询问。 Andy是说Postgres由于其实施而不能支持它,还是只是尚未实施?

如果无法实现,那么Postgres设计会阻止它这样做吗?如何规避?如果有可能,是什么阻碍了今天的实施?提前致谢。

postgresql memory-management database-design database-performance
1个回答
0
投票

[听讲,他说:

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

这只是部分正确。

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

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

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

但是PostgreSQL 可以要做的(这里的发言者是错误的)是让两个查询共享同一张表的顺序扫描:如果将synchronize_seqscans保留为其默认值on,则第二个想要与已经运行的查询扫描同一表的查询只会背负到正在运行的顺序扫描。这样比较容易,因为数据位于shared_buffers中,这是共享资源。如果您有多个并发顺序扫描同一张表,此功能将减少I / O。

© www.soinside.com 2019 - 2024. All rights reserved.