在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
是一个更好的主意,如果我的查询,大多是将要寻找的是有一个或多个关键字结果?
我会进一步标准化一步。
您应该拥有一个唯一的具有整数主键列的KeyWords表。然后,另一个具有KeyField和KeyWordId的关联表。
KeyWords
----------
KeyWordId Int Identity(1,1)
KeyWord VarChar(200)
KeyFieldKeyWords
----------------
Keyfield Int
KeyWordId Int
采用具有50个关键字各,这是50万行百万KeyFields中。如果你有一个有2列的表格,每个表格都是一个整数,那么在性能上会有很大的差异。
这是我实施它的方式,它似乎是在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)
)
和,当然索引关键字列。如果你永远不需要获得关键字的所有关键字,你可以通过改变主键的顺序来避免额外的索引
编辑:我不应该当我太累了。这是方式。
但我有50个关键字不是一个,除非我误解了你的解释。 – gary 2009-08-07 05:30:19
对不起,我的坏。现在更新。 – erikkallen 2009-08-07 13:15:32
规范化可能是你最好的选择,但只有模拟工作量肯定会知道。您将比较50个日益稀疏的100万行索引与1个5000万行索引。我怀疑,如果我是MS的天才写一个搜索一个索引的算法,我会拿起我期待的值,因为我一次走了很长时间。
但是如果有50个索引,我必须扫描50个索引。
此外,在非规格化模式中,第1列将具有高质量索引,第50列将具有低选择性并且可能导致扫描而不是索引查找。
对选择性的评论+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,...)
你会想关键字进行实验使用索引和引擎来获得最佳性能,但您可能只需要关键字上的一个索引。
还应该添加查询不是LIKE查询,但将直接像keyword ='helloworld' – gary 2009-08-07 01:01:47