我有一个由3列组成的大型PostgreSQL表,我在每个列上创建了一个单独的btree索引。然后,我在所有3列的表上创建了多个columns唯一约束,期望约束不会创建任何索引,因为它们都已被btree索引,结果正好相反,甚至最糟糕的是,它生成的约束对象大小大于所有3个索引的总和。如果有人愿意对这种行为有所了解的话,我想了解更多。
发布于 2023-03-19 04:04:27
多列唯一约束只能通过跟踪每个值组合来强制执行,因为这就是多列约束所表示的。
我在每个列上创建了一个单独的btree索引。
这些索引对于强制执行约束毫无用处,因为它们需要引擎进行三个单独的btree查找,以找到匹配的行并在它们之间进行某种形式的连接。这将是非常低效的。相反,引擎维护一个覆盖所有三列的单一索引,允许高效的btree查找。
话虽如此,原始索引可能对任何事情都没有多大用处。单列索引很少有用,因为它意味着始终需要查找键。
相反,可以考虑使用多列和/或INCLUDE列。例如,表(a, b, c)可能有索引(a, b) INCLUDE(c)和(b, a) INCLUDE(c),这些索引允许每个索引完全覆盖a或b上的范围和相等的查找,而不需要查找。
您还可以使用唯一索引而不是唯一约束,它允许您添加不属于键的INCLUDE列(尽管Postgres也允许在约束上这样做),以及其他仅用于索引的选项。
https://dba.stackexchange.com/questions/324877
复制相似问题