【问题标题】:Indexing a Denormalized Table on Perfectly Correlated Int and VarChar在完全相关的 Int 和 VarChar 上索引非规范化表
【发布时间】: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


【解决方案1】:

由于您有一个具有重复值的非规范化表,因此建议首先创建一个聚集列存储索引。不仅可以提高查询性能,还可以减小表的大小。

创建聚集列存储索引后,您可以根据执行的查询随时添加索引。这种方法比从一开始就盲目地创建索引要好。为了识别丢失的索引,您可以使用内置工具,例如实际执行计划,它将显示任何丢失索引的警告。

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 2018-01-02
    • 2012-12-31
    • 2018-11-23
    • 2011-07-13
    • 2013-01-17
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    相关资源
    最近更新 更多