2

想从中得到一些建议。我有一张表,我想在其中跟踪一个对象以及与该对象相关的键列表。例子:

OBJECTID   ITEMTYPE   ITEMKEY
--------   --------   -------
1          1          THE
1          1          BROWN
1          2          APPLE
1          3          ORANGE
2          2          WINDOW

OBJECTID 和ITEMKEY 都具有很高的选择性(即OBJECTID 和ITEMKEY 变化很大)。我的访问有两种方式:

  • 按 OBJECTID:每次对象更改时,键列表都会更改,因此需要基于 OBJECTID 的键。变化经常发生。

  • By 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 ...根据要求,也许有更好的方法?

在此先感谢,安德鲁

4

1 回答 1

1

如果可能的话,尽量保持你的聚集键尽可能小,因为它也会被添加到你表上的所有非聚集索引中。

因此,如果可能的话,我会使用一个 INT,或者可能是两个 INT 的组合——但肯定不会是一个VARCHAR列——特别是如果该列可能很宽(> 10 个字符)并且必然会发生变化。

所以在你提出的选项中,我个人会选择 b) - 为什么?

添加代理DirectoryID将满足集群键的所有关键标准:

  • 小的
  • 稳定的
  • 独特的
  • 不断增加

并且您的其他非聚集索引将受到最小的影响。

请参阅 Kimberly Tripp 的优秀博客文章,了解在 SQL Server 表上选择良好集群键的主要标准 - 非常有用且很有启发性!

为了满足您的查询要求,我将添加两个非聚集索引,一个在ObjectID(可能包括其他经常需要的列),另一个通过ItemKey键名搜索。

于 2010-10-03T08:29:08.383 回答