sql-server - SQL Server 中多列非聚集索引中的列顺序重要吗?

标签 sql-server non-clustered-index

为 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]) 

最佳答案

是的,这很重要!

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

因此,使用您的第一个版本的索引 MultiFieldIndex_1 ,如果您可能会使用

  • 使用全部四列
  • 使用 A、B、C 列
  • 使用 A、B 列
  • 使用 A 列

但如果您使用,它不会永远不会被考虑

  • 仅 D 列
  • C 列和 D 列 等等

但是,如果您仅指定 D,则可能会使用索引的第二个版本 ,或DC - 但如果您只指定A,它将永远不会被使用和B

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

关于sql-server - SQL Server 中多列非聚集索引中的列顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28475877/

相关文章:

sql-server - 什么是非聚集索引扫描

sql-server - sqlserver rake db 连接错误 :migrate

sql - 导入到 Azure SQL 后主键唯一约束被禁用

MYSQL 多列索引

sql-server - 如何在我的搜索表列上创建临时非聚集索引并在选择操作后将其删除

MySQL:聚集(逻辑索引)保存的地方

sql-server - 'SQLNCLI' 提供商未在本地计算机上注册

sql - 如何过滤 where 子句中的复合键?

带有存储过程的 SQL Server openquery() 不返回数据