Oracle 有全局索引,Postgres 没有。到目前为止,一切都很好。
然后,Oracle 具有本地前缀索引和非前缀索引,并且即使在 V19 中,Oracle 也充分利用了这种差异:Oracle Docs
我真的不明白为什么 Oracle 会产生这种差异,我只能用“惰性编程”向自己解释,但这不是这里的问题。
我的问题是:除了这些明显的原因之外,在 postgres 中为索引添加前缀是否有用:
- 将分区键作为索引中的前缀对您很有用,因为索引中的排序对您很有用
- 将分区键作为索引中的前缀对您很有用,因为分区键可以有许多不同的值
阅读 Oracle 的术语,前缀索引似乎是以分区键作为前导列的索引。
我不认为前缀索引有什么特别之处。如果您需要它来提高性能,请创建它。如果没有,就不要。
这是一个例子:想象一个大表,在时间戳上按年份进行范围分区,以便可以轻松丢弃旧数据。如果您需要按该时间戳快速搜索数据,则可能需要在列上建立索引以避免对整个分区进行顺序扫描。瞧,一个前缀索引;没什么特别的。
更重要的区别是索引是否包含分区键,无论分区键是否位于前导列中。使用本地索引(PostgreSQL 只有这些),您无法强制跨分区的唯一性,因此您只能在分区表上创建本地唯一索引(如果它根据定义是唯一的,即包含分区键)。
您引用的 Oracle 文档说“使用前缀索引,获得分区修剪的可能性比使用非前缀索引高得多”。但这是胡说八道。如果条件中有分区键,则可以进行分区修剪
WHERE
,并且索引不能影响WHERE
查询可能使用的条件。综上所述,我也不知道Oracle为什么要做这样的区分。Oracle 文档说,通过前缀索引,Oracle 可以使用索引进行分区修剪,但我不明白为什么这会产生巨大的差异。