PostgreSQL 教程: 何时使用表空间?

四月 18, 2024

摘要:在本教程中,您将了解表空间在 PostgreSQL 中何时有用。

介绍

表空间旨在允许 PostgreSQL 集群分布到多个存储设备上。创建表空间时,会在集群数据目录的 pg_tblspc 目录中,创建一个指向新创建的表空间目录的符号链接。

使用表空间会使数据库管理更加复杂,因为数据目录不再包含所有数据。

在绝大多数情况下,您不应该在 PostgreSQL 中创建额外的表空间。特别是,在与数据目录相同的文件系统上,或与另一个表空间相同的文件系统上,创建表空间是没有意义的。

那么,表空间有什么好处,可以值得引入管理上面的复杂性呢?

高吞吐量 IOPS

如果将数据分布在不同设备上的多个文件系统中,则可以分散 I/O 负载。但是,这可以通过在较低层级上进行条带化来完成。如果在操作系统级别使用条带化,与使用表空间仔细放置表和索引相比,可获得更好的分布。

如果您想更快地访问某些索引,可以将索引或表移动到另一个更快/具有更高 IOPS 的文件系统上,以加快重要查询的速度。请务必调整表空间选项,以告知查询规划器新表空间的速度有多快!

数据库增长

如果由于某种原因无法扩容数据库所在的文件系统,则可以在其他挂载的文件系统中创建新的表空间,并移动现有对象到新的表空间,或者将新表空间用作后续新对象的缺省表空间。

如果磁盘上的空间不足,表空间为您提供了一种添加更多存储空间的方法。但是,现在很多用户通常会使用某种类型的卷管理器,从而可在操作系统级别来执行扩容操作。

存储配额

如果要对数据库或表设置大小限制,可以将其放在一个大小有限的文件系统上的表空间中。

如果遇到如下所示的错误消息,则表示数据库的磁盘空间不足。

ERROR: could not extend file "base/16384/61892": No space left on device
HINT: Check free disk space

节省资金成本

如果您同时拥有快速、昂贵和缓慢、廉价的存储,则可以将需要良好性能的对象,放在一个快速存储上的单独表空间中。您也可以将很少访问的一些历史数据,放在慢速存储上的表空间中。

在这种情况下,您应该调整表空间上的seq_page_costrandom_page_costeffective_io_concurrency选项,以告诉优化器这些表空间的性能特征。

利用文件系统的特性

您有一个包含容易进行压缩的数据表吗?那可以尝试将其移动到一个启用了压缩的 ZFS 文件系统上的表空间。ZFS 文件系统还支持具有动态调整大小和 RAID 功能的简化版卷管理器。

临时文件

PostgreSQL 在使用 “CREATE TEMP TABLE..” 明确要求,或者需要临时保存大型数据集以完成查询时,可创建临时表和索引。

可以告诉 PostgreSQL 将此类对象放到单独的表空间中。例如,如果在正常过程中创建了太多的临时表,则可以通过将此类对象放置在具有更快硬件、更快/无日志/无压缩的文件系统,甚至内存文件系统上的表空间中,来加快查询速度。

如果要在默认表空间以外的其他位置创建临时文件(用于临时表和查询处理),则可以将 temp_tablespaces 参数设置为其他表空间。

总结

如果您在使用虚拟化存储的虚拟化环境中运行,则除了存储配额之外,上面提到的应用场景都没有太多实际意义。由于现在几乎每个人都使用虚拟化,因此表空间逐渐变成了一个越来越无关紧要的 PostgreSQL 特性。

在 PostgreSQL 中很少会用到表空间。建议抵制住创建表空间的诱惑,并将所有数据保留在默认表空间中。