我负责一个较小的 DB 300+ 百兆 100'ish 表,大约有 45 个用户在整个工作日内点击它。主要是读取,但有相当数量的更新和插入。我一直在放慢学习数据库结构的速度,以便从中获得一些性能。我听说查看索引是一个很好的起点。所述数据库的表的所有大多数索引都是集群的,其中一些是非集群的。
集群与非集群相比有速度优势吗?我有一个维护计划(是的,我知道),在差异备份之前每晚重新组织和重建索引,现在这是否足够好,直到我更好地掌握索引的形成和利用?
是否有(一个或多个)脚本可以帮助我查看各种索引的“性能”?我把自己弄进了多大的蠕虫罐头?
聚集索引确定表中数据的物理顺序,并且对于经常搜索值范围的列特别有效。当索引值唯一时,它们对于查找特定行也很有效。
通常(有例外),聚集索引应该位于单调增加的列上 - 例如标识列,或值增加的其他列 - 并且是唯一的。在许多情况下,主键是聚集索引的理想列(但不要将聚集索引放在唯一标识符/GUID 列上。)
从这篇MSDN 文章:
SQLServerpedia.com 有一些很好的索引调整文章/教程:索引相关的 DMV 查询和使用正确的索引以获得最佳性能。
我读过使用代理键并在该列上使用聚集索引是非常好的做法。通常,这将是一个将自动递增 (IDENTITY) 的 int 列,或者是一个 uniqueidentifier(使其成为顺序 GUID以避免以后出现性能问题!)。
这样做时,您的查询将对跨表的这些代理键执行 JOIN,从而为您提供性能和可伸缩性。
至于其他(非聚集)索引,该选择取决于您的客户如何使用您的应用程序。太多的索引对插入/更新来说意味着灾难。索引不足会减慢读取速度。您需要在两者之间找到平衡。与搜索结合使用的列是索引的逻辑候选,包括复合(多列)索引(在这种情况下请注意列顺序)。
如果您想变得花哨,请拥有一个单独的 OLAP 数据库来报告历史数据。