[英]SQL Server - Clustered index design for dictionary
想從中得到一些建議。 我有一張要跟蹤對象的表以及與該對象相關的鍵的列表。 例:
OBJECTID ITEMTYPE ITEMKEY
-------- -------- -------
1 1 THE
1 1 BROWN
1 2 APPLE
1 3 ORANGE
2 2 WINDOW
OBJECTID和ITEMKEY都具有很高的選擇性(即OBJECTID和ITEMKEY差異很大)。 我的訪問方式有兩種:
通過OBJECTID:每次對象更改時,鍵列表都會更改,因此需要基於OBJECTID的鍵。 變化經常發生。
通過ITEMKEY:這是用於關鍵字搜索的,並且也經常發生。
因此,我可能需要兩個鍵,然后為聚簇索引選擇一個(這是更頻繁訪問的一個,或者是我想要的速度,現在讓我們假設我將為聚簇設置OBJECTID的優先級)。 我感到困惑的是我應該如何設計它。
我的問題是,哪個更好:
a)(OBJECTID,ITEMTYPE,ITEMKEY)的聚集索引,然后是(ITEMKEY)的索引。 我擔心的是,由於聚集索引太大(2個整數,1個字符串),因此索引將很大,因為所有索引項都必須指向聚集鍵。
b)創建一個具有運行標識DIRECTORYID(整數)作為主鍵和聚集索引的新列,並聲明兩個索引,分別為(OBJECTID,ITEMTYPE,ITEMKEY)和(ITEMKEY)。 這將使索引空間最小化,但查找成本更高。
c)(OBJECTID,ITEMTYPE,ITEMKEY)的聚集索引,以及(ITEMKEY,ITEMTYPE,OBJECTID)的物化視圖。 我的邏輯是,這避免了鍵查找,並且仍將與在a)中進行查找的索引一樣大,但開銷更高。
d)錯誤……鑒於需求,也許有更好的方法嗎?
預先感謝,安德魯
如果可能,請嘗試使集群鍵盡可能小,因為它也會被添加到表中的所有非集群索引中。
因此,如果可能,我將使用INT,或者可能使用兩個INT的組合-但絕對不要使用VARCHAR
列-尤其是如果該列可能很寬(> 10個字符)並且勢必會發生變化。
因此,在您提出的選項中,我個人會選擇b)-為什么?
添加代理DirectoryID
將滿足集群鍵的所有關鍵條件:
而您的其他非聚集索引將受到最小的影響。
有關在SQL Server表上選擇良好的群集鍵的主要標准,請參見Kimberly Tripp的出色博客文章 -非常有用且有啟發性!
為了滿足您的查詢要求,我將添加兩個非聚集索引,一個在ObjectID
(可能包括經常需要的其他列),另一個在ItemKey
以ItemKey
進行搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.