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

标签 sql sql-server tsql 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

最佳答案

是的。是有区别的。

复合索引 IDX_IndexTables_1 可用于在 where 子句中使用 val1 列的任何查询。

复合索引 IDX_IndexTables_2 可用于在 where 子句中使用 val2 列的任何查询。

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

SELECT val1, val2 FROM IndexTables
WHERE val1 = some_value

但可用于此查询:

SELECT val1, val2 FROM IndexTables
WHERE val2 = some_value AND val1 = some_other-value

考虑综合索引的方法就像考虑纸质电话簿;它按姓氏列进行索引,然后按名字列进行索引:您可以按姓氏进行查找,但不能按名字单独进行查找。

关于sql - 列以相反顺序定义的 2 个索引之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549847/

相关文章:

c# - 如何在存储过程中抛出 SQLException

MySQL 将 varchar 排序为数字问题

sql - 在没有匹配项的情况下显示结果 - SQL Server 2008

sql - 如何在orientdb中添加天数

sql - 列数 每个过程返回 T-Sql

sql - TSQL - 替换或删除两个不同字符串之间的字符串,多次在整个列的字段中

sql-server - SQL 绕过 REPLACE by CASE 语句

python - 如何让 cx-oracle 将查询结果绑定(bind)到字典而不是元组?

c# - 查找两个多边形之间的最短距离(SqlGeography c#)

sql - 表与临时表性能