首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能使用三个非唯一的索引来强制执行唯一的约束?

问为什么不能使用三个非唯一的索引来强制执行唯一的约束?
EN

Database Administration用户
提问于 2023-03-17 17:53:17
回答 1查看 57关注 0票数 1

我有一个由3列组成的大型PostgreSQL表,我在每个列上创建了一个单独的btree索引。然后,我在所有3列的表上创建了多个columns唯一约束,期望约束不会创建任何索引,因为它们都已被btree索引,结果正好相反,甚至最糟糕的是,它生成的约束对象大小大于所有3个索引的总和。如果有人愿意对这种行为有所了解的话,我想了解更多。

EN

回答 1

Database Administration用户

发布于 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也允许在约束上这样做),以及其他仅用于索引的选项。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/324877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档