我负责一个较小的数据库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数据库报告历史数据。