PostgreSQL上所有列的索引

时间:2014-12-14 15:18:05

标签: postgresql database-design indexing

这就是我所处的情况:

我有一个(主)表,其中包含id和更多列 然后还有3个表只包含id(加入主表的id)和timestamp

所有表上的ID都被定义为唯一,因此id有一个隐式索引可以加速JOIN。问题是,如果我在加入后检索timestamp,它不在索引中,因此它会强制Postgres进行位图索引扫描和位图堆扫描(或seq扫描,具体取决于行数),仅用于该值。

问题是,我是否应该替换包含id和timestamp的隐式索引?那将是一个与表格具有相同数据的索引,在这方面听起来像是浪费空间。

另外,如果我希望UNIQUE支票保留到位,我想我必须保留原始索引。

更新:忘记添加,这些表具有非常高的常量写入速率和偶发读取,但读取一次访问许多行。这就是为什么我宁愿使用所有插入而不是更新(所有在一个表中)。 另一件事是,这些表中的行可能以任何顺序出现,我无法确保在小表到达之前插入主表行。

1 个答案:

答案 0 :(得分:2)

您在UNIQUE上只有id个约束的表格,而且只有一个其他列。 id加入main_table.id,也是唯一的,有效的1:1关系。

你担心用索引浪费空间

我建议您将这些表完全替换为主表中的单个可空列。这将节省更多空间,并自动保证主表中每id一个值。

与其他表格相比,不要过于担心NULL storage, that's extremely cheap

如果主表很大而且辅助表只有很少的行(比率<1:1000!),或者如果你在辅助表上有很多更新(更新比大统一行更便宜)你的设计开始有意义(从存储/性能的角度来看)。在这种情况下,是的,您需要(id) 上的UNIQUE或PK约束的(隐式)索引以及 (id, timestamp)上的多列索引以允许索引 - 只扫描。