【问题标题】:Partitioned table - is adding an index on the partition column unnecessary?分区表 - 是否不需要在分区列上添加索引?
【发布时间】:2021-08-19 01:56:25
【问题描述】:

我们有一个按日期列分区的表。

我的一些同事认为这意味着该列会自动建立索引。在寻找这方面的证据后,我不相信事实如此。谁是对的?

手册https://www.postgresql.org/docs/current/ddl-partitioning.html(第 5.11.2.1 节。示例)说:

在关键列上创建一个索引,以及您创建的任何其他索引 可能想要,在分区表上。 (关键索引不严格 必要,但在大多数情况下它是有帮助的。)这会自动 在每个分区上创建一个匹配的索引,以及您创建的任何分区 create or attach later 也会有这样的索引。索引或 在分区表上声明的唯一约束在 分区表的方式相同:实际数据在子表中 各个分区表上的索引。

这表明我们应该创建索引。

每个分区有大约 350K 行。由于我们经常在该列上按日期范围查询,每个分区会获得自己的索引吗?还是一个巨大的跨所有分区?

在此列上添加索引会提高还是降低性能?

【问题讨论】:

  • 每个分区都会有个人索引。遗憾的是,postgres 不支持全局索引(这对于确保真正的唯一性非常有用)。
  • 感谢您的回复。我不确定我是否理解全局索引如何确保唯一性。如果每个分区都有自己的唯一索引,这不会发生吗?此外,如果您在一个狭窄的日期范围内进行查询,那么全局索引的优势是什么?每个分区上较小的索引不是更快吗?
  • 假设您有一个表“unique_things(thing_id numeric, some_date date) 按范围分区 (some_date)”。在 postgres 中,这意味着您不能在“thing_id”字段上创建唯一索引 only。相反,您必须在“(thing_id,some_date)”上创建复合唯一索引,(显然)不提供“thing_id”字段的真实唯一性。它只是 N 个本地唯一 composite 索引。如果您必须保证“thing_id”重复数据删除,那么您遇到的问题无法通过 postgres 轻松解决(例如,与 oracle 不同,因为 oracle 支持 分区表上的全局索引) .
  • 就 r\w 速度全局索引而言是一种权衡,因为它们本质上会影响写入速度。我们添加了分区以减少 r\w 并发,但全局索引是全局的,将成为热点。解释如何消除全局索引对写入速度的影响需要花费大量时间,但由于 postgres 中缺乏该技术,因此完全脱离了 postgres 上下文:)

标签: postgresql


【解决方案1】:

分区列上不会自动建立索引。

如果您进行了列表分区并且每个列表只包含一个日期(即每个日期都有自己的分区),那么我认为在该列上也有一个索引不会有帮助。列中没有超出分区已经知道的额外信息。

如果您在季度或年度进行范围分区,但经常按特定日期查询,那么索引可能会很有用,因为它提供了很多额外的特异性。

【讨论】:

  • “如果您在季度或年度进行范围分区,但经常按特定日期查询,那么索引可能会很有用,因为它提供了很多额外的特异性。”是的,这正是我们的用例,除了我们按月而不是按季度划分。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多