索引视图:如何选择聚集索引?

时间:2010-02-05 10:35:47

标签: sql-server performance database-design indexed-view

我将基于三个具有内部和外部联接的表(SQL Server 2005)来执行索引视图。我将针对此视图运行所有类型的查询。 所以,我想知道选择要聚集哪个索引的最佳方法是什么。有什么标准或有什么工具可以帮助我。

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

提前致谢!

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

3 个答案:

答案 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上增加了成本   索引重建(由于   群集密钥的选择不佳   现在更有可能)。

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

答案 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集群在主键上,这通常是一个不错的选择。如果您有大量表查找的密集查询,则可以更改它。更改聚集哪个索引可以消除表查找。