具有相同聚类索引的更多表,我可以省略卫星表上的PK索引吗?



我有多个存储调用数据的表,它们具有相同的聚集索引:start_time (DATETIME)。基本表是calls",我有一个calls_participants"和一个calls_other_data。所有的表都有一个标识调用的call_id CHAR(36)列,所以它当然应该被索引。

我打算存储很多行(10亿),如果可能的话,我想节省空间和维护成本,所以我的想法是只在基本表上索引call_id列,这样除了CLUSTERED start_time索引外,其他表不会有任何索引。然后,如果我必须根据call_id访问calls_other_data表中的一行,我会这样写:

SELECT cod.some_column
FROM calls_other_data cod
WHERE cod.start_time = (SELECT start_time 
FROM calls 
WHERE call_id = '36-chars-unique-value')
AND cod.call_id = '36-chars-unique-value'

我想说这个查询的性能和在calls_other_data上有一个索引是完全一样的。call_id,因为calls.call_id索引可以以相同的方式使用:自动包含start_time值,所以SQL Server必须执行相同的步骤:

  1. 索引查找(either table).call_id得到start_time
  2. calls_other_data.start_time上查找聚集索引

我只是从来没有读过这样的设计,想看看别人对它的看法:)你知道有什么缺点吗?

显然,如果调用表中缺少一行,那么在其他表中查找它将很困难,但我不介意。

谢谢:)

我明白你的意思了。就像calls表一样,calls_other_data仍然携带call_id列和start_time列,但是calls_other_date.call_id列不会被索引,因为索引会带来存储成本。这似乎是你的想法。

这里需要注意的是,由于聚集索引在任何表上都不是唯一的,sql将通过添加一些称为唯一标识符的额外数据使唯一。因此,这里已经有了您可能没有考虑到的额外存储空间,您可以尝试"优化"。 我建议不要采用这种方法。存储成本低,唯一索引对优化器有很大帮助,外键列(或类似外键的列,如果实际上没有任何引用完整性)上的索引是一个很好的经验法则。

相关内容

  • 没有找到相关文章

最新更新