【问题标题】:Postgres - One Giant Table vs 10k+ Separate Tables - PartitioningPostgres - 一个巨型表与 10k+ 个单独的表 - 分区
【发布时间】:2018-07-02 08:55:33
【问题描述】:

在过去的 2 年中,我们尝试了许多不同的数据库引擎和数据库样式来解决需要 NoSQL 和 RDBMS 包的特性的特定问题。我们选择了 RDBMS 和 Postgres。

我们已经对许多不同的场景进行了性能测试,结果表明 Postgres 一直都能很好地处理所有事情,但我们知道模拟不是生产,其他人在大规模数据库方面的经验大相径庭。

一个巨人与许多小型是一个老生常谈的论点,但我的问题是关于大规模适度硬件的效率(适度硬件开始于小型 linux VPS 机器,随着需求的增长变得越来越大)。

我们有一个表(5 列,2 个索引(1 个三向索引)),很容易超过 10 亿行。如果我们改为说 10 个(甚至 100k)个表,这会稀释服务器资源,因为由于表的数量过多,索引不能全部保存在 ram 中?如果数据被拆分,那么几乎所有 10k 表都将被读取/写入,因此没有特定的活动表。

在讨论分区时,由于所有分区都是热的,我认为这也将带来有限的好处,因为读/写活动的广泛传播。

所以我的问题是:“在资源有限的情况下,当数据在单个表中分区或拆分到多个表中时,Postgres 是否会变得效率低下。只有一个表索引和几乎所有的表索引可以提高效率吗?活动集中在表格的末尾。”

【问题讨论】:

  • 如果您的目标是分区,那么很可能值得等待 Postgres 11(将于 2018 年第四季度发布),因为它对分区表有显着的性能改进。另外:通常部分(也称为“过滤”)索引已经走了很长一段路,而不是分区。
  • 那么解决了吗?我曾经有一个带有 10k 个表的数据库,而 pgAdmin 的加载速度非常慢。我在想也许使用分区(与多个表相同?),或者使用几个大表会有所帮助?但是我不确定如果我限制整个数据库的刷新操作,那么 10K 表是否对我有用。

标签: sql postgresql database-design


【解决方案1】:

听起来您不会从分区中获得太多好处。如果你过分地做 10k 个分区,你可能会期望很多开销。即使你做了一些更合理的事情,比如 100 个分区,如果你使用触发器将元组引导到正确的分区,那仍然是很多开销。但是从将数据拟合到 RAM 的角度来看,拆分索引应该不是一个大问题。无论是否分区,总数据量几乎相同。

即使您没有一个好的分区键,分区的一些好处可能是:

  • 您(或 autovacuum 工作人员)可以分别对每个分区进行清理。与一张巨大的表不同,这可以在分区上并行发生。而且,如果连续进行,您仍然具有可以最终取得进展的离散块的优势。如果一个表真空在完成之前被中断,例如系统维护,它会丢失它完成的大部分工作并且需要重复;这可能是巨型桌子的主要问题。
  • 如果需要添加索引,可以将它们并行添加到不同的分区中。或者,您可以将它们按顺序添加,但使用大量小型维护窗口,而不是一个巨大的维护窗口。
  • 如果您需要重新编制索引(例如,为了解决索引膨胀)与添加索引相同的好处。
  • 如果您需要添加存储但无法对 RAID 进行在线扩展,您可以将分区迁移到不同的表空间。尽管您也可以将不同表空间中的分区添加到以前未分区的表中,所以这可能没有太大的好处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2016-02-23
    相关资源
    最近更新 更多