PostgreSQL中对不同表(同一数据库)的并发查询

时间:2011-03-01 00:39:32

标签: postgresql

有谁可以帮助我理解PostgreSQL的内部结构?如果我从两个客户端访问两个单独的表(相同的数据库),则与在不同时间在不同表上执行查询时相比,查询响应时间会增加。我很困惑,不同表上的同时查询会导致更长的执行时间。从理论上讲,如果我在不同的表上同时执行查询,则表将为两个客户端解锁表,并且执行时间应保持不变。

我想知道是否由于使用公共共享资源而导致任何开销,因为数据库是相同的。

请帮忙!

2 个答案:

答案 0 :(得分:1)

好吧,让我们采取最基本的案例。

磁盘上有两个大的表。

他们对这两个单独的表运行两个查询。

但是,虽然它们是由DB代表的两个独立的逻辑表,但实际上它们共享同一个磁盘。

因此,当每个postgres进程读取每个表时,磁盘头正在滑动并来回跳舞以尝试提供数据,因此每个进程在磁盘驱动器(单个共享资源)上相互争斗。

就像有一个有两个出纳窗口和两条线的银行,但后面只有一个出纳员完成所有工作。

这并没有考虑到可能会降低或加快查询速度的任何其他因素。只是一个可能发生的案例的基本例子。

答案 1 :(得分:0)

这里要记住一些事情。

首先,顺序和随机磁盘I / O之间存在巨大差异。使用随机磁盘I / O,您无法获得操作系统来帮助预取,但您可以使用顺序访问。因此,在顺序读取中,操作系统将提取比我们最初读取的数据更多的数据,并且当操作系统从另一个表中为另一个查询提取数据时,我们将获得该数据。在随机访问中,您将获得所描述的效果,但在随机访问中,您可以等待磁盘头移动而不会出现并发问题,因为您正在进行随机读取。

要记住的第二件事是不同的查询计划具有不同的I / O配置文件。如果我们从磁盘中提取表的10%,并且我们有一个索引,我们可能会选择按顺序加载索引,然后按逻辑顺序遍历以查找我们的记录(当磁盘正在执行操作时对于其他查询),然后接受开销,只需从磁盘中随机访问几页。这当然涉及这种等待移动的头,并且可能存在或不存在可能使更糟糕的并发问题。因此,完全有可能查询1将执行索引扫描,查询2将执行顺序扫描,并且将在查询1处理索引时提取所需的大部分数据。那么也许你会得到一些Will描述的问题,但可能并不多。

最后一件事,这真的很关键,就是缓存。数据库倾向于缓存大量记录,因为这样可以完全避免磁盘I / O.所以在这种情况下,你可能实际上有一些非常不同的东西。查询1可能在内存中工作,或者主要来自内存,而查询2可能会在磁盘上运行。一般情况下,如果你有足够的内存,你感兴趣的大部分数据都可以舒适地放入内存中,而其余的软件(如内核)也有空间,那么所有可能出现的磁盘I / O问题都不会是实际问题。 ,并且你通常只能击中磁盘将提交WAL段。

所以答案是“这取决于”。这取决于您的系统。这取决于您的RAM和数据大小。这取决于您的硬盘和操作系统。这取决于具体的查询。这取决于其他使用模式。这取决于。