【发布时间】:2021-10-28 01:54:11
【问题描述】:
我有多个存储通话数据的表,它们具有相同的聚集索引:start_time (DATETIME)。基表是“calls”,我有一个“calls_participants”和一个“calls_other_data”。所有的表还有一个 call_id CHAR(36) 列来标识一个调用,所以它当然应该被索引。
我要存储很多行(10 亿),如果可能的话想节省空间和维护成本,所以我的想法是只在基表上索引 call_id 列,所以其他表不会具有除 CLUSTERED start_time 索引之外的任何索引。 然后,如果我必须根据 call_id 访问 call_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上的聚集索引查找
我只是从来没有读过这样的设计,想看看其他人对此的看法:) 你知道有什么缺点吗?
显然,如果调用表中缺少一行,则很难在其他表中查找它,但我不介意。
谢谢:)
【问题讨论】:
-
这似乎很危险。如果两个电话同时开始怎么办?我认为呼叫的唯一标识符比跨表共享
start_time更有用。 -
可能你的 start_time 不是 unique 所以这不是一个好键
-
这就是为什么我要过滤 start_time 和 call_id。
-
这可能更适合 Code Review Stack Exchange,因为它提供了解决方案并征求意见。
标签: sql sql-server database-design