2

我将基于三个表(SQL Server 2005)建立一个索引视图,它们之间有内连接和外连接。我将针对此视图运行各种查询。所以,我想知道选择要聚集的索引的最佳方法是什么。标准是什么,或者有什么工具可以帮助我。

(对不起,如果我的问题很无聊,我在设计数据库方面没有很多经验)。

提前致谢!

编辑:我应该在这里澄清一下,我在视图中使用的表的使用非常频繁,我为维护索引所花费的任何开销都应该得到回报。

4

3 回答 3

4

由于它是一个索引,因此您必须选择一个列(或一组列),该列(或一组列)保证在所有情况下都是非空且唯一的。这是最大和最严格的标准 - 任何可能为 NULL 或重复的内容从一开始都是不可能的。

根据您将在此索引视图上运行的查询类型,您可能还想查看是否有任何列(例如 DATE 或其他内容)将对其运行范围查询。这可能会成为聚类键的有趣候选者。

但最重要的是:您的集群键在任何情况下都必须是唯一且非空的。以我个人的经验,为了减少索引大小(从而增加每页的条目数),我会尝试使用尽可能小的键 - 单个 INT 是最好的,或者两个 INT 的组合 - 或者可能一个 GUID - 但不要在集群键中使用 VARCHAR(500) 字段!

更新:对于那些一直告诉我们聚集索引不需要唯一的发帖人——看看“索引女王”金伯利·特里普 (Kimberly Tripp) 对这个话题的看法:

让我们从我在集群键中寻找的关键内容开始:

* Unique
* Narrow
* Static

为什么是独一无二的?
集群键应该是唯一的,因为集群键(如果存在)被用作所有非聚集索引的查找键。以书后的索引为例 - 如果您需要查找索引条目指向的数据 - 该条目(索引条目)必须是唯一的,否则,哪个索引条目将是您要查找的条目? 因此,当您创建聚集索引时 - 它必须是唯一的。但是,SQL Server 不需要在唯一列上创建您的集群键。您可以在任何您想要的列上创建它。在内部,如果集群键不是唯一的,那么 SQL Server 将通过向数据添加一个 4 字节整数来“唯一化”它。因此,如果聚集索引是在不唯一的东西上创建的,那么不仅在创建索引时会有额外的开销,还会浪费磁盘空间、INSERT 和 UPDATE 的额外成本,并且在 SQL Server 2000 中,聚集索引会增加成本重建(因为集群键选择不当,现在更有可能)。

来源:http ://www.sqlskills.com/blogs/kimberly/post/Ever-increasing-clustering-key-the-Clustered-Index-Debateagain!.aspx

于 2010-02-05T11:58:24.447 回答
1

经验法则:选择您可能会在查询中使用 MOST 的列作为 WHERE、GROUP 等。这些列可能是非聚集索引的良好候选者。选择一列(或一组列),这可能会使您的行独一无二,并且可能是聚集索引的良好候选者。

正如 marc 所提到的,聚集索引施加了唯一约束,因此绝对需要您选择的列不应该有任何空值和重复。

于 2010-02-05T12:13:07.353 回答
0

聚集索引不必是唯一的。其中的列甚至可以为空。例如,这将在没有错误的情况下运行:

create table  #test (col1 int identity, col2 int)
create clustered index ix_test on #test (col2)
insert into #test (col2) values (1)
insert into #test (col2) values (1) -- Duplicate in clustered index
insert into #test (col2) values (null)

聚集索引是磁盘上表结构的一部分。因此,聚集索引不使用额外的磁盘空间。

默认情况下,SQL Server 群集在主键上,这通常是一个不错的选择。如果您有大量表查找的密集查询,您可以更改它。更改聚集的索引可以消除表查找。

于 2010-02-05T12:18:09.200 回答