5

假设 pgsql 在文件系统上为每个表存储 1 个文件并在 pg_catalog 中搜索每个查询以进行查询计划,那么在单个 pgsql 数据库中可以保持良好性能的最大表数是多少?

EG:pgsql 可以处理单个数据库中的 100 万个表吗?假设使用的文件系统是 ext4 并且每个表包含的数据非常少,因此磁盘存储容量过大不是问题。问题实际上来自 (1) 文件系统上有 100 万个文件的影响和 (2) pg_catalog 中有 100 万个条目的影响。

从这个线程(2005),http ://postgresql.1045698.n5.nabble.com/GENERAL-Maximum-number-of-tables-per-database-and-slowness-td1853836.html - 它在下面说(但我不知道这些天有多少仍然适用):

本杰明·阿拉伊写道:

当前每个数据库的最大表数是多少?此外,拥有更多表会以任何方式降低性能吗?

大多数情况下,答案是否定的。但是,一旦您获得接近 6 个数字的表数,pg_catalog 最终会变得非常庞大。问题是查询计划程序必须检查每个查询的 pg_catalog 以查看可用的索引、统计信息和值分布等,以便构建最佳计划。在某些时候,一个非常大的 pg_catalog 可能会开始使您的系统陷入困境。

...

William Yu <[隐藏的电子邮件]> 写道:

本杰明·阿拉伊写道:

当前每个数据库的最大表数是多少?此外,拥有更多表会以任何方式降低性能吗?

大多数情况下,答案是否定的。但是,一旦您获得接近 6 个数字的表数,pg_catalog 最终会变得非常庞大。

您还必须考虑在数据库目录中拥有数万个文件对性能的影响。虽然一些较新的文件系统对此并不特别担心,但当目录中有超过几千个条目时,很多人在查找时会陷入困境。

4

3 回答 3

3

一般来说,根据我所知道的使用大量表(成千上万)的人的说法,计划开销随着数据库中表数量的增加而增加。我认识的那些遇到过这个问题的人不得不为这个问题找到解决方案,但没有向我说明这些解决方案是什么。发生的是数据库规划器,为了确定执行查询的最佳方式,必须根据表和列查找信息,因此这需要在系统目录中搜索数据,而系统目录会随着时间的推移变得越来越臃肿。这会影响计划时的每个查询。

基本问题是,在规划时,您必须考虑表格(需要在表格上查找内容)和列以及列上的数据。有趣的是 pg_class 在 oid 上有一个索引,在 relnamespace 上有一个索引,但在 relname 上没有一个索引,而且你不能轻易地创建一个。系统表中唯一的索引是 UNIQUE 约束,所以除了更改系统目录(在源级别或授予您这样做的权限)之外,我看不出如何解决这个问题。

我还希望性能会缓慢下降,因此您不能对此进行硬性限制。因此,它取决于给定工作负载的可接受性能。

如果你有那么多表,我会先看看其中有多少可以分解到其他数据库中。

tl; dr:预计大量表会出现性能问题。期望必须具有创造性来解决它们。

于 2012-09-29T02:11:30.413 回答
3

您不必将一百万个文件保存在一个目录中。您可以使用CREATE TABLESPACE在不同的目录或不同的磁盘上安排空间。我对 pg_catalog 内部结构一无所知,但我可以想象它会如何首先按表空间缩小搜索范围,从而显着减少搜索时间。

但这与文件系统中通常存在一百万个文件的可能问题不同,或者与 pg_catalog 的实际(不是想象的)问题不同。

应该很容易做一个简单的(可能是误导性的)测试。使用您最喜欢的脚本语言创建一百万个表,每个表有五或六列。

于 2011-10-23T13:50:42.640 回答
1

这个博客和这个问题(包括评论)对这个问题有更多的了解。

回答你的问题:这取决于“同时仍然保持良好的性能”部分。您究竟认为“仍然表现良好”是什么?究竟有什么工作量?

让我重新表述你的问题:一个人能忍受多少牙痛?一样的答案!

但在这两种情况下,真正的问题是:你为什么要真正关心?在这两种情况下,更好的解决方案是采取措施消除原因并尽快进入无痛状态。

于 2011-10-23T13:52:24.543 回答