【发布时间】: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