【发布时间】:2011-03-01 00:39:32
【问题描述】:
谁能帮助我了解 PostgreSQL 的内部结构?如果我从两个客户端访问两个单独的表(相同的数据库),与在不同时间对单独的表执行查询相比,查询响应时间会增加。我很困惑不同表上的同时查询如何导致更长的执行时间。理论上,如果我在不同的表上同时执行查询,则两个客户端的表都是解锁的,并且执行时间应该保持不变。
我想知道由于数据库是相同的而使用公共共享资源是否会产生任何开销。
请帮忙!
【问题讨论】:
标签: postgresql
谁能帮助我了解 PostgreSQL 的内部结构?如果我从两个客户端访问两个单独的表(相同的数据库),与在不同时间对单独的表执行查询相比,查询响应时间会增加。我很困惑不同表上的同时查询如何导致更长的执行时间。理论上,如果我在不同的表上同时执行查询,则两个客户端的表都是解锁的,并且执行时间应该保持不变。
我想知道由于数据库是相同的而使用公共共享资源是否会产生任何开销。
请帮忙!
【问题讨论】:
标签: postgresql
好吧,让我们以最基本的情况为例。
您有两个大表存储在磁盘上。
他们对这两个单独的表运行两个查询。
但是,虽然它们是由 DB 表示的两个独立的逻辑表,但它们实际上共享同一个磁盘。
因此,当每个单独的 postgres 进程读取每个表时,磁盘头在来回滑动和跳舞以尝试提供数据,因此每个进程都在磁盘驱动器上相互争斗,这是一个单一的共享资源。
这就像一家银行有两个柜员窗口和两条线,但只有一个柜员在后面做所有的工作。
这并没有考虑到任何其他可能会降低或加快查询速度的因素。只是可能发生的一种情况的基本示例。
【讨论】:
这里有很多事情要记住。
首先,顺序磁盘 I/O 和随机磁盘 I/O 之间存在巨大差异。使用随机磁盘 I/O,您不会让操作系统帮助预取,但您可以使用顺序访问。因此,在顺序读取中,操作系统将拉入比我们最初读取的数据多得多的数据,我们将在操作系统从另一个表中提取数据以进行另一个查询的同时获取它。在随机访问中,您会得到所描述的效果,但在随机访问中,您必须等待磁头移动而不会出现并发问题,因为您正在执行随机读取。
要记住的第二件事是,不同的查询计划具有不同的 I/O 配置文件。如果我们从磁盘中拉出 10% 的表页面,并且我们有一个索引,我们可能会选择顺序加载索引,然后按逻辑顺序遍历以查找我们的记录(当磁盘在做一些事情时)对于另一个查询),然后接受从磁盘随机访问几页的开销。这当然涉及这种等待磁头移动的过程,并且可能存在也可能不存在可能使情况变得更糟的并发问题。因此,查询 1 完全有可能进行索引扫描,而查询 2 将进行顺序扫描,并在查询 1 处理索引时提取所需的大部分数据。那么也许你会得到威尔描述的一些问题,但可能不多。
最后一件事,也是非常关键的,是缓存。数据库倾向于缓存大量记录,因为这完全避免了磁盘 I/O。所以在这种情况下,你实际上可能有一些非常不同的东西。查询 1 可能在内存中运行,或者主要从内存中运行,而查询 2 可能会访问磁盘。一般来说,如果你有足够的内存,你感兴趣的大部分数据都可以舒适地放入内存中,并且有空间留给内核等其他软件,那么所有可能的磁盘 I/O 问题都不会是实际问题,并且您通常会访问磁盘的唯一时间是提交 WAL 段。
所以答案是“视情况而定”。这取决于您的系统。这取决于您的 RAM 和数据大小。这取决于您的硬盘驱动器和操作系统。这取决于具体的查询。这取决于其他使用模式。视情况而定。
【讨论】: