2011-12-08 45 views
0

我有一张表,其中每秒添加3行数据,并且我打算保留大约30M行。 (旧数据将被删除)。我应该为重复值(varchar)使用单独的表吗?

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

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

  1. 添加一列VARCHAR(1000)
  2. 创建一个表(INT ID,VARCHAR(1000)值) 内StoredProcedure的加入,查看该值是否存在于其他表中或创建它 我希望这个其他表始终具有最大值100。

我知道这两个选项之间的一些折衷,但我很难在这个问题上下定决心。

选项1较重,但我得到更快的插入。需要更少的连接,因此查询更简单。 选项2较轻插入需要很长时间,但查询有可能会更快。我认为我更接近正常的形式,但是我也有一个有一个有意义的列的表。

从我给你的信息看,哪个选项好看? (你也可以想出另一种选择)。

+0

这个新列中会有很多NULL值吗?您是否需要根据此列的内容搜索大型表格?另外,表格已经有多少个字符? – Sparky

+0

你正在使用哪个版本的Microsoft SQL(由tSQL标签假设)? – Sparky

+0

我期待大约20%的NULL值。我可能需要根据本专栏的内容进行一些搜索,但大部分时间范围将被索引列减少到大约10万行。每个条目大约200个字符。 – Benoittr

回答

2

你也应该调查page compression,也许你可以做简单的事情,并仍然得到一个小(ish)表。尽管如果你说的是SQL Express,你将无法像Enterprise Edition的要求那样使用它。

我在我的项目中反复使用了第二种方法。每个插入将不得不通过一个存储过程来获取查找值id,或者如果找不到并插入一个新的并返回该id。特别是对于像您这样的大型列,似乎有很多行,但有很少的不同值,空间节省应该胜过查询连接中外键和查找开销的额外开销。另见Disk is Cheap... That's not the point!

+0

尽管这个特定的数据库正在运行一个快速版本,但我们在另一个上下文中部署了一个完整版本,并且页面压缩可能很有用。感谢指针。从所有的评论和这个答案我得到以下内容:除非你有一个特定的理由来反规范化,否则一直坚持正常的形式。 – Benoittr

相关问题