我面临以下问题。我有一张非常大的桌子。该表是以前从事该项目的人员的传承。该表在MS SQL Server中。
该表具有以下属性:
您可能会猜到,不可能对该表运行任何合理的查询。现在人们只将新记录插入表中,而没有人使用它。因此,我需要对其进行重组。我计划创建一个新结构,并用旧表中的数据重新填充新结构。显然,我将实现分区,但这不是唯一要做的事情。
该表最重要的功能之一是,那些纯文本字段(即不必将其转换为另一种类型)通常具有频繁重复的值。因此,给定列中值的实际变化范围是5到30个不同的值。这引发了进行规范化的想法:对于每个这样的文本列,我将创建一个附加表,其中包含该列中可能出现的所有不同值的列表,然后在该附加表中创建一个(tinyint)主键,然后将在原始表中使用适当的外键,而不是将这些文本值保留在原始表中。然后,我将在此外键列上放置一个索引。用这种方法处理的列数约为100。
它提出了以下问题:
抱歉,这么长的文字。
感谢您的每条评论!
PS我创建了一个有关加入100张桌子的相关问题。 联接100张桌子
除了针对数据运行查询的速度外,您还将发现标准化数据的其他好处…例如大小和可维护性,仅凭这些就可以证明对其进行标准化…
但是,它也可能会提高查询速度。当前只有一行包含300个文本列的行非常庞大,并且几乎可以肯定已经超过了存储行数据页的8,060字节限制…,而是存储在ROW_OVERFLOW_DATA或LOB_DATA分配单元中。
ROW_OVERFLOW_DATA
LOB_DATA
通过规范化来减小每行的大小,例如用TINYINT外键替换冗余文本数据,并且还通过将不依赖于此大表主键的列删除到另一个表中,数据将不再溢出,并且您每页还可以存储更多行。
TINYINT
至于通过执行JOIN获取标准化数据而增加的开销…如果正确索引了表,则不会增加大量开销。但是,如果确实增加了不可接受的开销,则可以根据需要有选择地对数据进行规范化。
JOIN