我有多个存储调用数据的表,它们具有相同的聚集索引: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必须执行相同的步骤:
- 索引查找
(either table).call_id
得到start_time
- 在
calls_other_data.start_time
上查找聚集索引
我只是从来没有读过这样的设计,想看看别人对它的看法:)你知道有什么缺点吗?
显然,如果调用表中缺少一行,那么在其他表中查找它将很困难,但我不介意。
谢谢:)
我明白你的意思了。就像calls
表一样,calls_other_data
仍然携带call_id
列和start_time
列,但是calls_other_date.call_id
列不会被索引,因为索引会带来存储成本。这似乎是你的想法。