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