这适用于SQL Server。
我有一个包含大量行的表,并且该表将被多次查询,因此我需要确保我的设计已经过优化。
仅针对该问题,请说该表包含2列。名称和类型。 名称是varchar,它将是唯一的。
类型可以是5个不同的值(type1 ... type5)。 (未来可能包含更多值)
我应该创建一个varchar(并创建一个索引),还是最好创建一个类型表,该表包含5行,只有一列名称,make类型是外键?
两种方法之间是否存在性能差异?查询并不总是具有相同的条件。有时,它会使用不同的值查询名称,类型或两者。
编辑:考虑到在我的应用程序中,如果type是一个表,则会缓存ID,因此我不必每次都查询Type表。
答案 0 :(得分:0)
严格地说,如果将所有数据保存在一个表中,您可能会获得更好的查询性能。然而,这样做被称为“非规范化”,并带来许多非常重要的缺点。
varchar
字段,而不是一个小的,甚至是tinyint,可以为你的表添加一个非常重要的大小如果您发现需要返回“大”表和type
表中的其他一些信息,并且您担心加入性能,那么就不会这样。这是一个概括,但如果你的大表中有500M行,我看不到很多用例,你想要返回所有这些行;你可能会得到一个子集。在这种情况下,该连接可能更易于管理。如果您索引type
,则连接应该非常活泼。
如果您确实采用了非规范化数据的路线,我建议仍然将查找表作为“类型”的“主要定义”,因此它不是数百万行数据的集合体。
如果您仍希望在没有查找表的情况下对数据进行非规范化,那么至少在列上设置CHECK
约束以限制哪些值是允许的。
答案 1 :(得分:0)
“很多行”多少钱? 如果它是数十万或更多,那么Columnstore Index可能是合适的。
这取决于您的需求,但通常您希望type列具有数值(在您的情况下为tinyint)。