【问题标题】:Index view: How to choose the Clustered Index?索引视图:如何选择聚集索引?
【发布时间】:2011-01-13 11:22:47
【问题描述】:

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

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

提前致谢!

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

让我们从我认为的关键事情开始 在聚类键中查找:

* Unique
* Narrow
* Static

为什么独特?
集群键应该是 唯一的,因为一个聚类键(当 一个存在)用作查找键 来自所有非聚集索引。拿 例如在 a 后面的索引 book - 如果您需要查找数据 索引条目指向 - 那个 条目(索引条目)必须是唯一的 否则,哪个索引条目将是 你要找的那个?那么,当 您创建聚集索引 - 它 必须是唯一的。但是,SQL Server 不需要你的集群 键是在唯一列上创建的。你 可以在您想要的任何列上创建它 喜欢。 在内部,如果集群 键不是唯一的,那么 SQL Server 将 通过添加一个 4 字节来“唯一化”它 整数到数据。所以如果 聚集索引创建于 不是独一无二的东西 只有在 索引创建,有浪费的磁盘 空间,插入的额外费用和 更新,在 SQL Server 2000 中, clustereD 有额外的成本 索引重建(这是因为 聚类键的错误选择是 现在更有可能)。

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

【讨论】:

  • 那么,聚集索引应该像表中的主键一样起作用吗?顺便说一句,感谢“SQL Server”名称的修改。我仍然对微软不断提出的所有名称感到困惑:)
  • 默认情况下,SQL Server 将使用您在表上的主键作为其集群键。视图本身没有主键 - 但您可以设置的集群键也应该唯一标识每一行 - 这是它的工作。
  • 我认为这个答案中的两个说法都是错误的:聚集索引不必是唯一的,聚集索引不占用磁盘上的任何空间,因此减少聚集索引大小没有任何效果
  • Paul Randal 不建议使用 GUID 作为集群键。它会导致索引碎片。 sqlskills.com/blogs/paul/…
【解决方案2】:

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

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

【讨论】:

  • 我检查了自己,使用重复键创建聚集索引没有问题......问题是,可以这么说,最佳实践是什么以及如何充分利用我的聚集索引。我应该在这里澄清一下,我在视图中使用的表的使用非常频繁,我为维护索引所花费的任何开销都应该得到回报。
  • 一般建议是:将主键设为聚集索引。要给出具体建议,我们需要更多信息,至少需要表格布局、关系和运行的查询
  • @Anthares: YES 聚集索引必须是唯一的!这就是 SQL Server 实际查找数据的方式。如果您提供的列或一组列不能保证是唯一的,SQL Server 将向您的集群键添加一个 4 字节的唯一标识符。阅读 Kim Tripp 的博客 - 尤其是。此条目在这里:sqlskills.com/BLOGS/KIMBERLY/post/…
  • @Andomar:当然——聚集索引也会构建索引树,因此会占用空间!是的,聚集索引的叶级是实际的数据页——但聚集索引的中间页确实是索引页,会占用空间。
  • @Andomar:另外,如果您有许多非集群索引(不太可能在集群视图上,但肯定在表上),集群键(全部)将被添加到每个非聚集索引的每个条目。如果集群键过大,您将浪费大量空间,不仅在磁盘上,而且在 SQL Server 主内存中!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2013-08-07
    • 2014-07-28
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多