在特定表空间中创建PostgreSQL模式

8
根据PostgreSQL的简单配置建议,为了设置最灵活和可管理的环境,推荐的最佳实践是创建一个应用程序专用表空间,该表空间在/pgdata-app_tblspc上有其自己的挂载点,并且“每个模式应至少有两个表空间。一个用于表,一个用于索引。”
我能够创建这些挂载点和表空间,但想知道如何将模式分配给特定的表空间。据我所知,通过CREATE DATABASE ... TABLESPACE ...命令将表空间固定到数据库中,但在CREATE SCHEMA命令中没有TABLESPACE指令。
根据简单配置建议文档的逻辑,似乎隐含的建议是为每个应用程序创建一个数据库,每个数据库映射到两个表空间:一个用于数据,另一个用于索引。
然而,同一文档继续说,应用程序特定的数据库不是维护应用程序之间数据分离的首选方式。使用一个具有多个模式的数据库是正确的方法。
我在这里错过了什么?感谢任何提示。
1个回答

11
  • 为什么CREATE SCHEMA没有表空间子句?

    模式提供了数据的逻辑分离,而表空间提供了物理分离。仅持有数据的对象,如表和索引,在其CREATE语句中具有表空间子句。模式没有关联的数据文件。

    如果您希望驻留在不同模式中的表位于不同表空间中,您将需要在每个CREATE TABLECREATE INDEX语句中添加一个表空间子句。

  • 应该为每个应用程序使用两个表空间,一个用于表,一个用于索引吗?

    我会说这取决于您的性能要求和数据量。

    如果您正在处理多TB的数据仓库,并且想通过在不同存储系统上分布数据来优化性能,则使用表空间将是一个有趣的选项。

    对于规模较小的数据库,我会说这不值得麻烦,最好购买足够的RAM以将数据库放入内存中。

  • 不同数据库或不同模式分离不同应用程序的数据哪种更好?

    如果应用程序需要访问彼此的数据,请将它们放在一个数据库的不同模式中。否则,使用两个数据库以确保它们不能干扰彼此的数据。

总的来说,如果您想限制表的增长或表空间位于不同存储系统以进行负载分配,则表空间是不错的选择。


1
TableSpace的另一个常见用途是将频繁/大量访问的索引或表放置在性能非常快的设备上,例如SSD,并将访问速度要求较低的表/索引放置在非SSD设备上,例如HDD。 - kiran01bm
在我看来,你是在说逻辑分离和物理分离在逻辑上永远不可能有任何共性?这是一个很大的声明。我不喜欢仅仅因为某些组合没有被考虑而排除可能性的规则。有那么多用例存在,除非有一个可以争辩的理由说明它不应该存在 - 比如它会导致错误状态,否则排除它们是不合理的。将整个模式逻辑地归类为物理表空间是否有问题?在我的情况下,我正在归档一个模式 - 这似乎是合理的。 - Alexi Theodore
@AlexiTheodore 当然,您可以将不同模式中的表放入不同的表空间中。这只是一个不太常见的用例,没有人费心为其添加特殊功能。这两个概念是正交的。 - Laurenz Albe

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