我面临以下问题。我有一张非常大的桌子。这张桌子是以前参与该项目的人的遗产。该表位于 MS SQL Server 中。
该表具有以下属性:
- 它有大约 300 列。它们都有“文本”类型,但其中一些最终应该代表其他类型(例如,整数或日期时间)。因此,在使用之前必须将这些文本值转换为适当的类型
- 该表有超过 100 百万行。表的空间很快就会达到 1 TB
- 该表没有任何索引
- 该表没有任何已实现的分区机制。
正如您可能猜到的那样,不可能对该表运行任何合理的查询。现在人们只在表中插入新记录,但没有人使用它。所以我需要重组它。我计划创建一个新结构并用旧表中的数据重新填充新结构。显然,我将实现分区,但这不是唯一要做的事情。
该表最重要的特性之一是那些纯文本字段(即它们不必转换为另一种类型)通常具有频繁重复的值。因此,给定列中值的实际变化范围是 5-30 个不同的值。这引发了进行规范化的想法:对于每个这样的文本列,我将创建一个附加表,其中包含可能出现在该列中的所有不同值的列表,然后我将在这个附加表中创建一个(tinyint)主键和然后将在原始表中使用适当的外键,而不是将这些文本值保留在原始表中。然后我会在这个外键列上放一个索引。以这种方式处理的列数约为 100。
它提出了以下问题:
- 这种规范化真的会提高对这 100 个领域中的一些领域施加条件的速度吗?如果我们忘记保留这些列所需的大小,是否会由于使用 tinyint-columns 替换初始文本列而提高性能?如果我不进行任何规范化并简单地在这些初始文本列上放置一个索引,那么性能是否与计划的 tinyint-column 上的索引相同?
- 如果我进行所描述的规范化,那么构建一个显示文本值的视图将需要将我的主表与大约 100 个附加表连接起来。一个积极的时刻是我将为“主键”=“外键”对进行这些连接。但是仍然应该加入相当多的表。这里有一个问题:对这个视图进行的查询的性能与对初始非规范化表的查询的性能相比是否会更差?SQL Server 优化器是否真的能够以允许利用规范化优势的方式优化查询?
抱歉这么长的文字。
感谢您的每一条评论!
PS 我创建了一个关于加入 100 个表的相关问题; 加入 100 个表