SQL Server为一列创建多个非聚簇索引,而在一个索引中只有多列

v s*_*v s 6 sql-server multiple-columns non-clustered-index

假设我有下表

  • UserID (身份)PK
  • UserName - 唯一非null
  • UserEmail - 唯一非null

建议什么是最佳性能?

  • UserNameUserEmail单独创建非聚集索引

要么

  • 只有一个包括两个列

请分享你为什么一个人优于其他人的想法.

mar*_*c_s 13

另一个需要考虑的重点是:只有在引用了n个最左边的列时才会使用复合索引(由多个列组成)(例如在WHERE子句中).

所以如果你有一个复合索引

(UserID, UserName, UserEmail)
Run Code Online (Sandbox Code Playgroud)

那么这个索引可能会在以下场景中使用:

  • 当你UserID单独搜索时(仅使用最左边的1列 - UserID)
  • 当你正在搜索UserIDUserName(使用2个最左边的列)
  • 当你在搜索所有三列时

但是这个单一的复合索引永远不能用于搜索

  • 只是UserName- 它是索引中的第二列,因此不能使用此索引
  • 只是UserEmail- 它是索引中的第三列,因此不能使用此索引

请记住这一点 - 仅仅因为列是索引中的一部分并不一定意味着单独搜索该单个列将被该索引支持并加速!

因此,如果您的使用模式和您的应用程序确实需要搜索UserName和/或UserEmail单独搜索(不提供其他搜索值),那么您必须在这些列上创建单独的索引 - 只需一个化合物就不会有任何好处.