我将基于三个表(SQL Server 2005)建立一个索引视图,它们之间有内连接和外连接。我将针对此视图运行各种查询。所以,我想知道选择要聚集的索引的最佳方法是什么。标准是什么,或者有什么工具可以帮助我。
(对不起,如果我的问题很无聊,我在设计数据库方面没有很多经验)。
提前致谢!
编辑:我应该在这里澄清一下,我在视图中使用的表的使用非常频繁,我为维护索引所花费的任何开销都应该得到回报。
我将基于三个表(SQL Server 2005)建立一个索引视图,它们之间有内连接和外连接。我将针对此视图运行各种查询。所以,我想知道选择要聚集的索引的最佳方法是什么。标准是什么,或者有什么工具可以帮助我。
(对不起,如果我的问题很无聊,我在设计数据库方面没有很多经验)。
提前致谢!
编辑:我应该在这里澄清一下,我在视图中使用的表的使用非常频繁,我为维护索引所花费的任何开销都应该得到回报。
由于它是一个索引,因此您必须选择一个列(或一组列),该列(或一组列)保证在所有情况下都是非空且唯一的。这是最大和最严格的标准 - 任何可能为 NULL 或重复的内容从一开始都是不可能的。
根据您将在此索引视图上运行的查询类型,您可能还想查看是否有任何列(例如 DATE 或其他内容)将对其运行范围查询。这可能会成为聚类键的有趣候选者。
但最重要的是:您的集群键在任何情况下都必须是唯一且非空的。以我个人的经验,为了减少索引大小(从而增加每页的条目数),我会尝试使用尽可能小的键 - 单个 INT 是最好的,或者两个 INT 的组合 - 或者可能一个 GUID - 但不要在集群键中使用 VARCHAR(500) 字段!
更新:对于那些一直告诉我们聚集索引不需要唯一的发帖人——看看“索引女王”金伯利·特里普 (Kimberly Tripp) 对这个话题的看法:
让我们从我在集群键中寻找的关键内容开始:
* Unique * Narrow * Static
为什么是独一无二的?
集群键应该是唯一的,因为集群键(如果存在)被用作所有非聚集索引的查找键。以书后的索引为例 - 如果您需要查找索引条目指向的数据 - 该条目(索引条目)必须是唯一的,否则,哪个索引条目将是您要查找的条目? 因此,当您创建聚集索引时 - 它必须是唯一的。但是,SQL Server 不需要在唯一列上创建您的集群键。您可以在任何您想要的列上创建它。在内部,如果集群键不是唯一的,那么 SQL Server 将通过向数据添加一个 4 字节整数来“唯一化”它。因此,如果聚集索引是在不唯一的东西上创建的,那么不仅在创建索引时会有额外的开销,还会浪费磁盘空间、INSERT 和 UPDATE 的额外成本,并且在 SQL Server 2000 中,聚集索引会增加成本重建(因为集群键选择不当,现在更有可能)。
经验法则:选择您可能会在查询中使用 MOST 的列作为 WHERE、GROUP 等。这些列可能是非聚集索引的良好候选者。选择一列(或一组列),这可能会使您的行独一无二,并且可能是聚集索引的良好候选者。
正如 marc 所提到的,聚集索引施加了唯一约束,因此绝对需要您选择的列不应该有任何空值和重复。
聚集索引不必是唯一的。其中的列甚至可以为空。例如,这将在没有错误的情况下运行:
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 群集在主键上,这通常是一个不错的选择。如果您有大量表查找的密集查询,您可以更改它。更改聚集的索引可以消除表查找。