具有多个单列的非聚集索引和多列的组合之间的区别

3 index sql-server sql-server-2008-r2

乡亲

我是 DB 设计方面的新手。我想知道设计之间有什么区别和性能差异

  1. 许多具有单列的非聚集索引和具有许多列的非聚集索引组合。

  2. 或者理想情况下,在什么情况下我可以组合列来创建单个非聚集索引,如果是这样,我应该组合多少列?

  3. 选择非聚集索引列的标准是什么?(我知道它仅适用于不频繁更新的表)...

  4. 就我的问题而言,2005/2008 和 2012 SQL Server 在非聚集索引方面有什么区别,而且 249 是我们可以创建的最大值吗?

先感谢您。

mar*_*c_s 6

拥有多个索引需要 SQL Server 为每个插入、删除或更新语句维护和更新多个索引。因此,索引越少通常越好。

但是,当您有一个复合索引(由多列组成)时,这仅在您使用/指定查询中最左边的 n 列时才有帮助。

因此,如果您在 ( City, LastName, FirstName) 上有一个地址表的索引,那么在以下情况下可能会使用该索引

  • 您的WHERE子句中包含所有三列
  • WHERE City = 'London'在查询中指定(使用最左边的 1 列)
  • WHERE City = 'London' and LastName = 'Smith'在查询中指定(使用最左边的 2 列)

然而,这样的指标不能永远被用于:

  • 使用WHERE FirstName = 'Joe'子句查找所有行- 您没有使用该索引中最左边的 n 列
  • 使用WHERE LastName = 'Brown' AND FirstName = 'Charlie'子句查找所有行- 再次:您没有使用该索引中最左边的 n 列

复合索引不能(在许多情况下)替换所有的单列索引。在设计和创建复合索引时要非常小心,以确保以它们真正有用的方式设计它们!

因此,虽然复合指数确实有其存在的理由,而且它们通常更可取 - 您还需要确保它们真的能够被使用。一个正在维护的索引(并导致 SQL Server 方面的工作),但永远不能在任何查询中使用,是有史以来最糟糕的索引 - 没有收益,只有维护开销。

您还应该阅读 Kimberly The Queen of Indexing Tripp 关于 SQL Server 索引的优秀博客文章 - 最值得注意的是索引:仅仅因为您可以,并不意味着您应该!