查询varchar与外键性能

时间:2017-07-31 03:24:56

标签: sql sql-server

这适用于SQL Server。

我有一个包含大量行的表,并且该表将被多次查询,因此我需要确保我的设计已经过优化。

仅针对该问题,请说该表包含2列。名称和类型。 名称是varchar,它将是唯一的。

类型可以是5个不同的值(type1 ... type5)。 (未来可能包含更多值)

我应该创建一个varchar(并创建一个索引),还是最好创建一个类型表,该表包含5行,只有一列名称,make类型是外键?

两种方法之间是否存在性能差异?查询并不总是具有相同的条件。有时,它会使用不同的值查询名称,类型或两者。

编辑:考虑到在我的应用程序中,如果type是一个表,则会缓存ID,因此我不必每次都查询Type表。

2 个答案:

答案 0 :(得分:0)

严格地说,如果将所有数据保存在一个表中,您可能会获得更好的查询性能。然而,这样做被称为“非规范化”,并带来许多非常重要的缺点。

  1. 如果你的表有“很多行”,那么为每一行存储一个额外的varchar字段,而不是一个小的,甚至是tinyint,可以为你的表添加一个非常重要的大小
  2. 如果需要更改任何数据,则必须对该表执行大量更新。这意味着在修改锁定期间事务日志增长和表上的潜在阻塞。如果将其存储为具有5行的单独表,如果需要更新与该数据关联的数据,则只需更新所需的5行中的一行。
  3. 对数据进行非规范化意味着该数据的定义不再存储在一个地方,而是存储在多个地方(实际上它存储在包含这些值的每一行中)。
  4. 由于上面列出的所有原因,管理该数据(插入,更新,删除,以及简单地定义数据)很快就会比简单地正确规范化数据更加开销,除了适当的索引之外,几乎没有任何好处。
  5. 如果您发现需要返回“大”表和type表中的其他一些信息,并且您担心加入性能,那么就不会这样。这是一个概括,但如果你的大表中有500M行,我看不到很多用例,你想要返回所有这些行;你可能会得到一个子集。在这种情况下,该连接可能更易于管理。如果您索引type,则连接应该非常活泼。

    如果您确实采用了非规范化数据的路线,我建议仍然将查找表作为“类型”的“主要定义”,因此它不是数百万行数据的集合体。

    如果您仍希望在没有查找表的情况下对数据进行非规范化,那么至少在列上设置CHECK约束以限制哪些值是允许的。

答案 1 :(得分:0)

“很多行”多少钱? 如果它是数十万或更多,那么Columnstore Index可能是合适的。

这取决于您的需求,但通常您希望type列具有数值(在您的情况下为tinyint)。