2016-11-18 50 views
0

我有一個包含兩列的日誌表。具有非唯一列的日誌表;要創建什麼索引

  1. DocumentType(VARCHAR(250),不是唯一的,不爲空)
  2. DateEntered(日期,不是唯一的,不爲空)

該表將只具有行插入,從不更新或刪除。

下面是報告的存儲過程:

SELECT DocumentType, 
     COUNT(DocumentType) AS "CountOfDocs" 
FROM DocumentTypes 
WHERE DateEntered>= @StartDate AND DateEntered<= @EndDate 
GROUP BY DocumentType 
ORDER BY DocumentType ASC; 

在未來用戶可能希望也文檔類型在不同的報告進行過濾。我目前有一個包含兩列的非聚集索引。這是創建適當的索引嗎?

+1

我猜DocumentType不是唯一的,正確的? –

+1

該表的插入的預期速率是多少? –

+0

正確沒有什麼是獨一無二的。每個工作日從100到1000的任何地方,通過每個SQL工作計劃一次。 – MilesMorales

回答

1

聚集索引的日期,當然。

我認爲你的NCI很好。我會說在兩個名字列,因爲我假設你將有WHERE條款中的日期爲您的查詢。我不認爲每天1000個最糟糕的情況會在加載數據時對插入時間產生重大影響。

+0

嗯,我不能在日期做聚集索引,B/C日期可能不是唯一的,因爲我可以在一個日期有多個插入。儘管看起來我很高興,但對我來說,NCI似乎是個好主意。 – MilesMorales

+0

很好。此外,你可以聚集在日期。聚集索引不必遵循主鍵。聚集索引是物理結構,PK是防止重複的邏輯約束。 – TJB

+0

是真的,但是如果我創建了一個不唯一的聚集索引,SQL Server會爲那些不是唯一的行添加一個「uniquefier」(一個4字節的INT),我認爲這是錯誤的做法,你通常爲非唯一數據做一個NCI。 – MilesMorales

1

請勿添加任何索引。這將是堆表,並等待你的「未來你」任務從這張表中選擇一些東西:)。

如果你想指數:

  1. 隨着堆:現場你將篩選添加索引,如果第二個是隻有在選擇(=不where子句)把第二個是包含柱。如果您將過濾兩欄的欄位置索引。

  2. 如果您想要添加聚簇索引(例如在新的自動增量主鍵列上),只需在col上添加一個索引就可以過濾或嘗試不添加附屬索引並檢查執行計劃和效果 - 在大多數情況下,覓得足夠的聚集索引。

不要在非唯一列上創建聚簇索引(僅在非常特殊的情況下使用它)。

+0

因此,你建議創建2個非聚集索引,這將涵蓋僅基於一列和/或兩列的查詢? – MilesMorales

+0

太棒了 - 你添加了qry - 所以DateEntered的索引幷包含DocumentType。 – Deadsheep39

+0

你可以更具體一點,你是說用兩列創建聚集索引?我發現當我創建兩個非聚集索引時,查詢執行了表掃描,一個非聚集索引包含兩個列,它執行了索引搜索。 – MilesMorales

相關問題