这就是我所处的情况:
我有一个(主)表,其中包含id
和更多列
然后还有3个表只包含id
(加入主表的id
)和timestamp
。
所有表上的ID都被定义为唯一,因此id
有一个隐式索引可以加速JOIN。问题是,如果我在加入后检索timestamp
,它不在索引中,因此它会强制Postgres进行位图索引扫描和位图堆扫描(或seq扫描,具体取决于行数),仅用于该值。
问题是,我是否应该替换包含id和timestamp的隐式索引?那将是一个与表格具有相同数据的索引,在这方面听起来像是浪费空间。
另外,如果我希望UNIQUE
支票保留到位,我想我必须保留原始索引。
更新:忘记添加,这些表具有非常高的常量写入速率和偶发读取,但读取一次访问许多行。这就是为什么我宁愿使用所有插入而不是更新(所有在一个表中)。 另一件事是,这些表中的行可能以任何顺序出现,我无法确保在小表到达之前插入主表行。
答案 0 :(得分:2)
您在UNIQUE
上只有id
个约束的表格,而且只有一个其他列。 id
加入main_table.id
,也是唯一的,有效的1:1关系。
你担心用索引浪费空间?
我建议您将这些表完全替换为主表中的单个可空列。这将节省更多空间,并自动保证主表中每id
一个值。
与其他表格相比,不要过于担心NULL storage, that's extremely cheap。
如果主表很大而且辅助表只有很少的行(比率<1:1000!),或者如果你在辅助表上有很多更新(更新比大统一行更便宜)你的设计开始有意义(从存储/性能的角度来看)。在这种情况下,是的,您需要(id)
上的UNIQUE或PK约束的(隐式)索引以及 (id, timestamp)
上的多列索引以允许索引 - 只扫描。