【发布时间】:2014-12-14 15:18:04
【问题描述】:
这是我现在的情况:
我有一个(主)表,其中有一个 id 和几列。
然后还有 3 个表只包含一个 id(连接到主表的 id)和一个 timestamp。
所有表上的 id 都被定义为唯一的,因此id 有一个隐式索引,可以加快 JOIN。问题是,如果我在加入后检索timestamp,它不在索引中,因此它强制 Postgres 进行位图索引扫描和位图堆扫描(或 seq 扫描,取决于行数),仅适用于那个值。
问题是,我应该将隐式索引替换为同时包含 id 和时间戳的索引吗?那将是一个与表具有相同数据的索引,在这方面听起来很浪费空间。
另外,如果我希望 UNIQUE 检查保持原位,我认为我必须保留原始索引。
更新:忘了补充,这些表具有非常高的恒定写入率和零星读取,但读取一次访问很多行。这就是为什么我宁愿使用所有插入而不是就地更新(全部在一张表中)。 另一件事是,这些表中的行可能以任何顺序出现,我无法确保主表行将在小行到达之前插入。
【问题讨论】:
-
您必须确实保留原始索引才能保留约束; Pg 没有仅在某些列上唯一的 btree 索引。至于其余的 - 这只是一个权衡,真的。
标签: postgresql database-design indexing