2个索引之间的差异,列以相反顺序定义

dan*_*die 11 sql t-sql sql-server indexing composite-index

以下两个索引之间是否有任何差异?

  • IDX_IndexTables_1
  • IDX_IndexTables_2

如果有,有什么区别?

create table IndexTables (
    id int identity(1, 1) primary key,
    val1 nvarchar(100),
    val2 nvarchar(100),
)

create index IDX_IndexTables_1 on IndexTables (val1, val2)
GO

create index IDX_IndexTables_2 on IndexTables (val2, val1)
GO
Run Code Online (Sandbox Code Playgroud)

Mit*_*eat 16

是.它们是有区别的.

复合索引IDX_IndexTables_1val1用于在where子句中使用该列的任何查询.

复合索引IDX_IndexTables_2val2用于在where子句中使用该列的任何查询.

因此,例如IDX_IndexTables_2不能用于此查询(但可以使用IDX_IndexTables_1):

SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value
Run Code Online (Sandbox Code Playgroud)

但可以用于此查询:

SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value
Run Code Online (Sandbox Code Playgroud)

考虑综合指数的方法是考虑纸质电话簿; 它由surname列索引,然后是firstname列:您可以按姓氏查找,但不能单独查看名字.