我应该为重复值(varchar)使用单独的表吗?

时间:2011-12-08 21:33:52

标签: sql sql-server database tsql database-design

我有一个表,每秒添加3行数据,我打算保留大约30M行。 (旧的数据将被删除)。

我需要添加一列:varchar(1000)。我不能事先告诉它内容是什么,但我知道它会非常重复:数千到数百万行将具有相同的值。它通常大约200个字符。

由于使用存储过程添加数据,我看到两个选项

  1. 添加列varchar(1000)
  2. 创建表(int id,varchar(1000)value) 在StoredProcedure中,查看该值是否存在于该另一个表中或创建它 我希望这个其他表总是最多有100个值。
  3. 我知道这两个选项之间的一些权衡,但我很难在这个问题上下定决心。

    选项1比较重但插入速度更快。需要较少的连接,因此查询更简单。 选项2是较轻的插入取longers但查询有可能更快。我认为我更接近正常形式,但我还有一个有一个有意义的专栏的表。

    根据我给你的信息,哪个选项似乎更好? (你也可以提出另一种选择)。

1 个答案:

答案 0 :(得分:2)

你还应该调查page compression,也许你可以做一件简单的事情,但仍然得到一个小的(ish)表。虽然,如果您说是SQL Express,您将无法像企业版要求那样使用它。

我在我的项目中反复使用了你的第二种方法。每个插入都必须通过一个获取查找值id的存储过程,或者如果找不到则插入一个新的并返回id。特别是对于像你这样的大型列而言,由于存在大量行但这么少的不同值,空间节省应该超过查询连接中外键和查找成本的额外开销。另请参阅Disk is Cheap... That's not the point!