【问题标题】:Suggestion on table partitioning in POSTGRES关于 POSTGRES 中表分区的建议
【发布时间】:2016-02-22 19:01:00
【问题描述】:

我正在设计 2 张桌子。

user_table (userid username) 预计有 10 万条记录

transaction_table(transactionid, date, description, userid) 预计有 50 亿条记录。预计每位用户的交易量接近 50K。

transaction_table 存储用户完成的交易。此表很少有任何UPDATEDELETE 操作。有重要的SELECTINSERT操作,但都是基于userid。因此,我要么将用户的事务插入表中,要么返回特定用户所做的事务。

划分transaction_table 有意义吗?

这是因为,将有 100K 个分区表,每个分区表用于 1 个用户。这在任何意义上都好吗?

我还有哪些其他选项可以让INSERTSELECTtransaction_table 上快速运行?

【问题讨论】:

  • 您希望对 transaction_table 进行哪些查询?如果您需要检索特定用户的所有事务,则按用户 ID 分区是有意义的。对于像“用户的 100 次最新交易”这样的查询,索引 (userid,date) 就足够了。
  • 我期待像 -- (1) 这样的查询。 “用户的前 X(比如 100)笔交易”。 (2)“用户的下 X 笔交易”(3)“用户 2015 年 1 月 1 日至 2015 年 1 月 1 日的所有交易”等

标签: postgresql database-schema data-modeling partitioning


【解决方案1】:

Postgresql 不建议创建many partitions:

检查主表所有分区上的所有约束 在约束排除期间,因此可能会出现大量分区 大大增加查询计划时间。使用这些分区 技术将适用于多达一百个分区; 不要尝试使用数千个分区。

在我看来,date(例如每月)创建的分区可能会更好。

另一种选择是按userid%100 创建分区,但不是每个用户。

【讨论】:

  • 基于日期的分区并不是我一开始想要的,这是因为我有查询说“返回我由特定用户进行的最后 100 笔交易”。无论如何感谢您的帮助。
  • 如果每个分区上都有(userid, date) 的索引就可以了。
  • 感谢斯塔斯。但是,如果我按 (userid,date) 进行索引,您不认为插入的性能会显着下降吗?
  • 不,我确定。我有一个分区表,每个分区大约有 2000 万条记录(每个月都会创建分区)。 Postgres 可以轻松使用它(有选择、插入和更新操作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多