Rat*_*rol 5 indexes performance sql-server sql-server-2005
我负责一个较小的 DB 300+ 百兆 100'ish 表,大约有 45 个用户在整个工作日访问它。主要是阅读,但有相当数量的更新和插入。我一直在放慢学习数据库结构的速度,以便从中获得一些性能。我听说查看索引是一个很好的起点。所述数据库的表的所有大多数索引都是聚集的,其中一些是非聚集的。
集群与非集群相比有什么速度优势吗?我有一个维护计划(是的,我知道)在差异备份之前每晚重新组织和重建索引,这是否足够好,直到我更好地掌握索引的形成和利用?
是否有(a)个脚本可以帮助我查看各种索引的“性能”?我把自己弄进了多大的蠕虫罐头?
聚集索引确定表中数据的物理顺序,并且在经常搜索值范围的列上特别有效。当索引值唯一时,它们对于查找特定行也很有效。
通常(也有例外),聚集索引应该位于单调增加的列上 - 例如标识列,或其他一些值正在增加的列 - 并且是唯一的。在许多情况下,主键是聚集索引的理想列(但不要将聚集索引放在 uniqueidentifier/GUID 列上。)
来自这篇MSDN 文章:
在创建聚集索引之前,请了解将如何访问您的数据。考虑使用聚集索引:
- 包含大量不同值的列。
- 使用 BETWEEN、>、>=、< 和 <= 等运算符返回一系列值的查询。
- 按顺序访问的列。
- 返回大结果集的查询。
- 涉及 join 或 GROUP BY 子句的查询经常访问的列;通常这些是外键列。在 ORDER BY 或 GROUP BY 子句中指定的列上的索引消除了 SQL Server 对数据进行排序的需要,因为行已经排序。这提高了查询性能。
- 需要非常快速的单行查找的 OLTP 类型应用程序,通常通过主键。在主键上创建聚集索引。
聚集索引不是一个好的选择:
- 频繁更改的列:这会导致整行移动(因为 SQL Server 必须按物理顺序保留行的数据值)。这是在数据趋于易变的大容量事务处理系统中的一个重要考虑因素。
- 宽键:来自聚簇索引的键值被所有非聚簇索引用作查找键,因此存储在每个非聚簇索引叶条目中。
SQLServerpedia.com 有一些很好的索引调整文章/教程:索引相关 DMV 查询和使用正确的索引以获得最佳性能。
我读过使用代理键并在该列上使用聚集索引是一种很好的做法。通常,这将是一个会自动递增 (IDENTITY) 的 int 列,或一个 uniqueidentifier(使其成为一个连续的 GUID以避免以后出现性能问题!)。
这样做时,您的查询将对这些跨表的代理键执行 JOIN,从而为您提供性能和可扩展性。
至于其他(非聚集)索引,该选择取决于您的客户如何使用您的应用程序。太多的索引会给插入/更新带来灾难。索引不足会减慢读取速度。您需要在两者之间找到平衡。与搜索结合使用的列是索引的逻辑候选,包括复合(多列)索引(在这种情况下请注意您的列顺序)。
如果您想花哨的话,可以使用单独的 OLAP 数据库来报告历史数据。
归档时间: |
|
查看次数: |
5694 次 |
最近记录: |