繁体   English   中英

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

[英]Best way to store large dataset in SQL Server?

我有一个数据集,其中包含一个字符串键字段和多达50个与该信息相关联的关键字。 将数据插入数据库后,几乎没有写入操作(INSERTS),但大多数查询一个或多个关键字。

我已经阅读了基于MySQL的“ Tagsystems:性能测试 ”,似乎2NF似乎是实现此目标的一个好方法,但是我想知道是否有人有使用SQL Server 2008和超大型数据集进行此操作的经验。

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

将结构

keyfield, keyword1, keyword2, ... , keyword50

是最好的解决方案或两张桌子

keyid
keyfield
| 1
|
| M
keyid
keyword

如果我的查询主要是在寻找具有一个或多个关键字的结果,那就更好了吗?

我将进一步标准化。

您应该有一个带有唯一主关键字列的唯一关键字表。 然后,另一个具有KeyField和KeyWordId的关联表。

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

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

100万个关键字段各自具有50个关键字,即5000万行。 如果您的表有2列,每列都是一个整数,那么在性能上会有很大的不同。

只要您有正确的索引,5,000万行就不会那么多。 我只是将其存储为

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

当然,还要为关键字列建立索引。 如果您永远不需要获取关键字段的所有关键字,则只需更改主键的顺序即可避免多余的索引

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

标准化可能是您最好的选择,但是只有模拟工作量才能确定。 您正在将50个日益稀疏的索引(每个索引100万行)与1个索引(5,000万行)进行比较。 我怀疑如果我是MS的天才,他编写了一种算法来搜索一个索引,那么我会花很长的时间来寻找自己想要的值。

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

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

我无法想象这样的查询

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 keyfield from mytable WHERE关键字,位于(value1,value2,...)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM