聚集索引与非聚集索引?

我负责一个较小的数据库300多百万张100个桌子,大约有45个用户在整个工作日内击中它。 大多数读取,但相当数量的更新和插入。 我一直在放慢学习数据库的结构,以获得一些性能。 我听说看看索引是一个很好的开始。 所述数据库表的所有大部分索引都是聚簇的,其中一些是非聚簇的。

有聚集与非聚集速度优势​​吗? 我有一个维护计划(是的,我知道)在差异备份之前每晚重新组织和重build索引,现在是否足够好,直到我更好地掌握索引的形成和使用?

是否有(a)脚本能够帮助我查看各种指标的“performance”? 我有多大的蠕虫能让自己进入?

聚簇索引确定表中数据的物理顺序,对于经常search值范围的列特别有效。 当索引值是唯一的时候,它们也可以有效地find特定的行。

通常(有例外),聚集索引应该在一个单调递增的列上,比如一个标识列,或者其他一些列正在增加的列,并且是唯一的。 在许多情况下,主键是聚簇索引的理想列(但不要将聚簇索引放在uniqueidentifier / GUID列上)。

从这个MSDN文章 :

在创build聚集索引之前,了解您的数据将如何被访问。 考虑使用聚集索引:

  • 包含大量不同值的列。
  • 使用BETWEEN,>,> =,<和<=等运算符返回一系列值的查询。
  • 按顺序访问的列。
  • 返回大型结果集的查询
  • 涉及连接或GROUP BY子句的查询经常访问的列; 通常这些是外键列。 ORDER BY或GROUP BY子句中指定的列的索引消除了SQL Server对数据进行sorting的必要性,因为行已经sorting。 这提高了查询性能。
  • OLTPtypes的应用程序需要非常快速的单行查找,通常通过主键。 在主键上创build一个聚集索引。

聚集索引不是一个好select:

  • 频繁更改的列:这会导致整个行的移动(因为SQL Server必须以物理顺序保留一行的数据值)。 在数据容易波动的大容量事务处理系统中,这是一个重要的考虑因素。
  • 宽键:聚簇索引中的键值被所有非聚簇索引用作查找键,因此存储在每个非聚簇索引叶条目中。

SQLServerpedia.com有一些很好的文章/教程索引调整: 索引相关的DMV查询和使用正确的索引最佳性能 。

我读过这是非常好的做法,使用代理键和使用该列上的聚集索引。 通常,这将是一个int列,它将自动递增(IDENTITY)或唯一标识符(使其成为一个连续的GUID以避免后续的性能问题!)。

这样做的话,你的查询将会在表中的这些代理键上进行连接,为你提供性能和可伸缩性。

至于其他(非集群)索引,这个select取决于你的客户如何使用你的应用程序。 索引太多拼写插件/更新的灾难。 指标不足会减慢阅读速度。 你需要find两者之间的平衡。 与search结合使用的列是逻辑候选索引,包括复合(多列)索引(在这种情况下请介意列顺序)。

如果你想变得有趣,有一个单独的OLAP数据库报告历史数据。