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

问题描述:

我有一个数据集,其中包含一个字符串键字段和多达50个与该信息相关的关键字。一旦数据被插入到数据库中,将会有很少的写入(INSERTS),但主要是查询一个或多个关键字。在SQL Server中存储大型数据集的最佳方法?

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

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

会的

keyfield, keyword1, keyword2, ... , keyword50 

的结构是最好的解决方案或两个表

keyid 
keyfield 
| 1 
| 
| M 
keyid 
keyword 

是一个更好的主意,如果我的查询,大多是将要寻找的是有一个或多个关键字结果?

+0

还应该添加查询不是LIKE查询,但将直接像keyword ='helloworld' – gary 2009-08-07 01:01:47

我会进一步标准化一步。

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

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

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

采用具有50个关键字各,这是50万行百万KeyFields中。如果你有一个有2列的表格,每个表格都是一个整数,那么在性能上会有很大的差异。

+0

这是我实施它的方式,它似乎是在SQL Server中存储这类数据的最快方法 – gary 2009-08-18 06:19:33

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

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

和,当然索引关键字列。如果你永远不需要获得关键字的所有关键字,你可以通过改变主键的顺序来避免额外的索引

编辑:我不应该当我太累了。这是方式。

+0

但我有50个关键字不是一个,除非我误解了你的解释。 – gary 2009-08-07 05:30:19

+0

对不起,我的坏。现在更新。 – erikkallen 2009-08-07 13:15:32

规范化可能是你最好的选择,但只有模拟工作量肯定会知道。您将比较50个日益稀疏的100万行索引与1个5000万行索引。我怀疑,如果我是MS的天才写一个搜索一个索引的算法,我会拿起我期待的值,因为我一次走了很长时间。

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

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

+0

对选择性的评论+1,可能具有最大的影响 – Rick 2009-08-07 01:20:03

我无法想象像

SELECT keyfield FROM mytable 
    WHERE keyword1 in (value1, value2, ...) 
    OR keyword2 in (value1, value2, ...) 
    OR keyword3 in (value1, value2, ...) 
    .... 
    OR keyword5 = in (value1, value2, ...) 

查询你的第二个选项看起来要好得多 SELECT关键字段FROM MYTABLE凡(值1,值2,...)

你会想关键字进行实验使用索引和引擎来获得最佳性能,但您可能只需要关键字上的一个索引。