【发布时间】:2011-04-20 10:17:35
【问题描述】:
希望得到一些建议。我有一张表,我想在其中跟踪一个对象以及与该对象相关的键列表。示例:
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 (integer) 作为主键和聚集索引的新列,并为 (OBJECTID,ITEMTYPE,ITEMKEY) 和仅 (ITEMKEY) 声明两个索引。这将最小化索引空间,但查找成本更高。
c) (OBJECTID,ITEMTYPE,ITEMKEY) 的聚集索引,以及 (ITEMKEY,ITEMTYPE,OBJECTID) 的物化视图。我的逻辑是,这避免了键查找,并且仍然与在 a) 中查找的索引一样大,但开销更高。
d) Err...根据要求,也许有更好的方法?
提前致谢, 安德鲁
【问题讨论】:
-
为什么你认为你需要集群在
(OBJECTID,ITEMTYPE,ITEMKEY)而不是(OBJECTID)上? -
如果您尝试在 SQL Server 中构建高性能关键字搜索,您应该考虑全文搜索:msdn.microsoft.com/en-us/library/ms142583.aspx
-
@Lucero:集群键必须是唯一的 - 而 ObjectId 不是。在这种情况下,SQL Server 将为您的索引条目添加一个四字节的唯一性 - 您可以通过为集群键选择一个真正唯一的列 (INT IDENTITY) 来避免这种情况。
-
@marc_s:鉴于此问题中的列选择,我认为隐式生成的唯一整数列应该比大多数其他组合更好。当然,如果唯一索引上的聚类匹配很好,则应该使用它,但恕我直言,这里没有。
-
@Lucero:感谢您的 cmets,我明白您的意思,但如果 SQL 无论如何要添加它,我不妨添加自己的身份/pk/clusterkey,例如(OBJECTID,DIRECTORYID) 以便在需要时可以将其用作单个唯一键(因为无法访问隐藏的 SQL)。但是我同意你的观点,如果我想要通过 OBJECTID 进行聚类,这将比使用 (OBJECTID,iTEMTYPE,ITEMKEY) 更好。
标签: sql sql-server database-design clustered-index