Postgresql一个数据库多个模式与多个数据库一个模式的比较

15

我一直在阅读这个问题,但是它并没有帮到我。考虑到数据库管理,我认为一个具有多个模式的数据库比另一个选项更容易维护,但就性能而言,哪个更好呢?是否有一种选项优于另一种?

TIA。

4个回答

12

如果性能很重要,那么除了基准测试你的特定用例之外,没有其他替代品。如果不是那么重要,那么就选择更容易管理的东西吧!与程序员/数据库管理员时间相比,硬件便宜,而且相对于更复杂的设置预期发生更高的事故率。更不用说电脑遵循摩尔定律,但一天的时间仍然固执地不变。

如果我必须猜测(因为我无法基准测试你的特定用例),我会猜测具有多个模式的一个数据库将表现更好,因为:

  1. 据我所知,每个连接都是到一个数据库的。在PostgreSQL中建立/拆除连接是昂贵的。

  2. 许多模式更接近许多表而不是许多数据库,并且我预计许多表将被优化,而不是许多数据库。

然而,我可以看到可能适用的反例。每个数据库都存储在一个单独的目录中。这使得使用普通文件系统工具(例如,挂载点和/或符号链接)轻松地跨文件系统(因此跨磁盘阵列)分割数据库。将数据库跨多个阵列分割非常不可能优于具有相同数量磁盘的较大的RAID10阵列,但会提供更好的隔离性(执行巨大查询的数据库A不会像以前那样对数据库B产生影响)。然而,请检查您的操作系统的IO调度程序文档;请记住,每个PostgreSQL连接都会获得自己的后端进程,因此每个进程的公平排队可能会更好地实现这一点。

请注意,您还可以使用PostgreSQL的CREATE TABLESPACE和相关功能将数据划分到文件系统中,因此上述内容也适用于模式。


"CREATE TABLESPACE和其他相关操作,因此上述操作也可以使用模式完成。"是的,我并没有看到使用多个数据库会有任何性能优势。顺便说一句,我不明白RAID与这个问题有什么关系。无论是数据库还是模式,您都可以在表空间中将任何内容放置在任何位置。" - Jeff Davis
@Jeff Davis:是的,你可以这样做,只需使用标准Unix工具而不是SQL命令即可轻松处理多个数据库。RAID的重点在于,通常情况下,将所有这些磁盘添加到RAID10中比仔细分割磁盘更容易获得更好的性能。 - derobert

5
性能方面,完全取决于您的应用程序。
例如,多个数据库需要每个数据库进行连接池。如果您有数百或数千个数据库,那么这几乎意味着您无法进行连接池。这将为除了具有单个持久连接到数据库的客户端应用程序之外的任何内容带来性能成本。
但是,如果您只“一次访问一个数据库”(而且不会在几秒钟内相互访问),则将事物保留在单独的数据库中仅需要为正在使用的数据库加载系统表缓存,从而留更多内存以缓存用户表(因为每个数据库中的系统表将显着较小)。
在大多数情况下,一个数据库中的模式将胜出。一种相当常见的解决方案是X个数据库和Y个模式的混合使用。

0

我认为这并不重要。每个表都将存储在单独的文件中,唯一的问题是文件所在的目录。由于性能主要受到对单个文件的读写操作的影响,因此文件在目录中的组织应该没有太大影响。


0

我认为,多个数据库与多个模式(命名空间)相比没有性能优势(除非您有大量表格)。CREATE TABLESPACE允许您将任何内容放置在文件系统的任何位置,因此在任一情况下都可以由您控制物理存储。

主要区别在于当您跨多个模式查询时,它比跨多个数据库查询要好得多。此外,如果所有内容都在同一个数据库中,则可以通过连接池共享更多连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接