【发布时间】:2021-03-26 02:15:24
【问题描述】:
我正在使用每天收集大约 35,000 行的非规范化表。
数据以自动方式从我们的生产数据库中进行非规范化处理。对数据进行非规范化的主要动机之一是基于 C# 的 UI 使用了许多复杂的、非持久性的计算,为了保证质量,我们不想通过视图重新创建这些计算。
目前,我们在此表上没有任何索引,但正在探索添加它们。我是一名统计学家,我仍在努力思考所有索引的细微差别。我最大的问题是索引完全相关的 INT 和 VARCHAR 的后果。
也就是说,InstrumentId (INT) 和 InstrumentName (VarChar(50)) 这两个字段是从同一个规范化表中记录的。我们将两者都包含在非规范化数据中,以便我们可以在没有连接的情况下显示名称,也可以在 INT 上进行查询。 (该数据库有大约 200 种独特的乐器)
即使我们出于查询的目的包含了 INT,但有时我们很懒,喜欢在 VarChar 上进行查询,因为它更容易验证条件。
当我们开始添加索引时,我很好奇将 INT 和 VARCHAR 索引为单独的非聚集索引会有什么影响。考虑因素包括速度、存储、碎片等。
将两者都添加为索引是一种合理的方法,还是可能会在未来引起麻烦?对讨论这些问题的阅读材料的参考表示赞赏。
我查看了this question,它讨论了选择其中一个的选项,但我很难找到关于同时使用这两个选项的参考资料。
【问题讨论】:
-
如果数据加载每天仅在几个小时内发生一次,那么插入性能并不是一个重要因素。一个重要的因素是存储大小(
varchar(50)是 52 字节,而int是 4 字节),不要忘记include列。如果你需要两个索引,那么你需要两个。当它有超过 6000 万行时,我不想在 5 年内进行一次表扫描。 -
这完全取决于您如何查询数据。如果你总是使用 varchar,有时使用 varchar + int - 那么复合键会一石二鸟。
标签: sql-server indexing denormalized