2009-08-07 106 views
2

我有一個數據集,其中包含一個字符串鍵字段和多達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

回答

3

我會進一步標準化一步。

您應該擁有一個唯一的具有整數主鍵列的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

2

只要你有正確的索引,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

2

規範化可能是你最好的選擇,但只有模擬工作量肯定會知道。您將比較50個日益稀疏的100萬行索引與1個5000萬行索引。我懷疑,如果我是MS的天才寫一個搜索一個索引的算法,我會拿起我期待的值,因爲我一次走了很長時間。

但是如果有50個索引,我必須掃描50個索引。

此外,在非規格化模式中,第1列將具有高質量索引,第50列將具有低選擇性並且可能導致掃描而不是索引查找。

+0

對選擇性的評論+1,可能具有最大的影響 – Rick 2009-08-07 01:20:03

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, ...) 

查詢你的第二個選項看起來要好得多 SELECT關鍵字段FROM MYTABLE凡(值1,值2,...)

你會想關鍵字進行實驗使用索引和引擎來獲得最佳性能,但您可能只需要關鍵字上的一個索引。

相關問題