在SQL Server中存储大型数据集的最佳方法?

时间:2009-08-07 00:57:24

标签: sql sql-server database sql-server-2008

我有一个数据集,其中包含一个字符串键字段和最多50个与该信息相关的关键字。一旦将数据插入数据库,就会有很少的写入(INSERTS),但主要是查询一个或多个关键字。

我读过基于MySQL的“Tagsystems: performance tests”,似乎2NF似乎是实现这一点的好方法,但我想知道是否有人有使用SQL Server 2008和非常大的数据集的经验

我最初可能有100万个关键字段,每个字段最多可包含50个关键字。

的结构
keyfield, keyword1, keyword2, ... , keyword50

是最佳解决方案或两个表

keyid
keyfield
| 1
|
| M
keyid
keyword

如果我的查询主要是要查找包含一个或多个关键字的结果,那么这是一个更好的主意吗?

4 个答案:

答案 0 :(得分:3)

我会进一步规范化。

您应该有一个包含整数主键列的唯一KeyWords表。然后,另一个具有KeyField和KeyWordId的关联表。

KeyWords
----------
KeyWordId Int Identity(1,1)
KeyWord VarChar(200)

KeyFieldKeyWords
----------------
Keyfield Int
KeyWordId Int

有100万个关键字段,每个关键字段有50个关键字,即5000万行。如果你有一个包含2列的表,每个都是一个整数,那么性能会有巨大的差异。

答案 1 :(得分:2)

只要你有正确的索引,50M行就不那么多了。我会把它存储为

CREATE TABLE mytable (
    keyfield nvarchar(200),
    keyword nvarchar(200),
    CONSTRAINT PK_mytable PRIMARY KEY(keyfield, keyword)
)

,当然索引关键字列。如果您永远不需要获取关键字段的所有关键字,只需更改主键中的顺序即可避免额外的索引

编辑:当我太累了,我不应该发帖。就是这样。

答案 2 :(得分:2)

归一化可能是你更好的选择,但只有模拟工作负荷才能确定。您将比较每个100万行的50个越来越稀疏的索引与1个5000万行的索引。我怀疑,如果我是MS的天才,编写一个算法来搜索一个索引,我会选择我正在寻找的值,因为我在一次传递中进行了很长时间。

但如果有50个索引,我必须扫描50个索引。

此外,在非规范化模式中,第1列将具有高质量索引,第50列将具有低选择性并且可能导致扫描而不是索引查找。

答案 3 :(得分:0)

我无法想象像

这样的查询
SELECT  keyfield FROM mytable
  WHERE keyword1 in (value1, value2, ...)
     OR keyword2 in (value1, value2, ...)
     OR keyword3 in (value1, value2, ...)
     ....
     OR keyword5 = in (value1, value2, ...)

你的第二个选择看起来好多了     在(value1,value2,...)

中选择键字段FROM mytable WHERE关键字

您需要尝试使用索引和引擎来获得最佳性能,但您可能只希望在关键字上使用一个索引。