簡體   English   中英

SQL Server-字典的聚集索引設計

[英]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 (可能包括經常需要的其他列),另一個在ItemKeyItemKey進行搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM