中间表应该聚类,如果是,如何?

时间:2017-04-15 22:05:19

标签: sql database relational-database

如果表A具有fk1和fk2,并且该表经常与fk1和fk2连接,但很少同时使用。假设fk1 + fk2是唯一的。

该表是否应该有一个索引fk1_and_fk2,并且该表是否应该聚集在该索引上?

或者该表是否应该在fk1上有一个索引,另一个在fk2上并且聚集在其中一个上?

1 个答案:

答案 0 :(得分:1)

如果我们只考虑查询,那么您应该有一个自动递增的主键,并将(fk1, fk2)(fk2, fk1)定义为唯一。这假设这些列永远不会NULL。或者,您可以通过其他方式定义它。 (如果它们不是unique,您只需定义一个索引。)

这将加速两种类型的查询。此外,仅使用这些列的查询可以直接使用索引,而无需引用原始数据页。

通过使用自动递增/标识/生成的始终/串行主群集密钥,插入更快,因为它们总是位于表的末尾。 (当然,您确实可以在页面中间插入索引。)

缺点?

  • 插入(以及更新和删除)会慢一点,因为需要更新多个索引。
  • 这比原始表格占用更多空间。

类似的替代方案是让其中一对成为主(聚集)索引。这方面的缺点是新插入页面溢出。