SQL Server 中多列非聚集索引中的列顺序是不是重要?

Posted

技术标签:

【中文标题】SQL Server 中多列非聚集索引中的列顺序是不是重要?【英文标题】:Does the order of columns in an multicolumn non-clustered index matter in SQL Server?SQL Server 中多列非聚集索引中的列顺序是否重要? 【发布时间】:2015-04-13 02:16:21 【问题描述】:

为 SQL Server 表创建的多列非聚集索引中的列顺序真的很重要吗?

例如是

CREATE NONCLUSTERED INDEX [MultiFieldIndex_1]  
ON [Table_01] ([Column_A],[Column_B],[Column_C],[Column_D])

一样
CREATE NONCLUSTERED INDEX [MultiFieldIndex_1]  
ON [Table_01] ([Column_D],[Column_C],[Column_B],[Column_A]) 

?

【问题讨论】:

【参考方案1】:

是的,这很重要!

如果您的查询包含该索引的 n 最左侧 列,则可能会使用该索引

所以对于您的第一个版本的索引MultiFieldIndex_1,如果您使用它可能

使用所有四列 使用 A、B、C 列 使用 A、B 列 使用 A 列

但如果您使用它,它将不会考虑

只是 D 列 C 列和 D 列 等

但是,如果您仅指定 DDC,则可能会使用您的第二版索引可能 - 但它会永远不会 如果您只指定 AB 则使用

仅当您始终使用索引中定义的所有列时,它们的定义顺序(几乎)变得无关紧要(仍然存在一些细微差别至于按最高选择性排序等,但这些比如果您没有在 SELECT 语句中指定最左边的 n 列将永远不会使用索引这一事实重要得多)

【讨论】:

查询是指 WHERE 子句中的列对吗?

以上是关于SQL Server 中多列非聚集索引中的列顺序是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别

在 SQL Server 中更改非聚集索引以添加更多包含的列

具有不同排序方向的多列上的Sql server聚集索引

SQL Server 2016新特性:列存储索引新特性

数据库索引

SQL Server查询优化和事务处理