以相反的顺序定义的列2名之间的索引差(Difference between 2 indexes wi

2019-07-21 23:06发布

是否有以下两个指标之间的差异?

  • 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

Answer 1:

是。 它们是有区别的。

综合指数IDX_IndexTables_1可用于其中的任何查询val1列where子句中使用。

综合指数IDX_IndexTables_2可用于其中的任何查询val2列被where子句中使用。

所以,例如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

想想一个综合指数的方法是想想纸质电话簿; 它是由姓列索引,然后将名字列:您可以自行查找按姓氏而不是姓。



Answer 2:

多列索引是比服用的所有列的字段和concatinating在一起概念性没有不同 - 索引结果作为单个字段。

由于索引是B树他们总是找遍从左到右。 你必须开始从左边的搜索,你向右移动,换做其工作,并提供有用的结果指数配对下来的结果。

由于只有一个字段建立索引:

WHERE val1 LIKE 'myvalue%' (uses index)
WHERE val1 LIKE '%myvalue' (cannot use index)

同样的概念被应用于多列索引:

当订单VAL1,VAL2

WHERE val1='value1' (uses index)
WHERE val2='value2' (cannot use index)

当订单值2,VAL1

WHERE val1='value1' (cannot use index)
WHERE val2='value2' (uses index)

如果这两个字段都精确匹配索引的顺序在这种情况下并不重要。

WHERE val1='value1' AND val2='value2' (uses index in any order)


Answer 3:

你有什么是一个综合指数。 当你的WHERE子句不使用复合索引中的所有列的顺序很重要。

考虑此查询:

SELECT val1
FROM IndexTables
WHERE val1 = 'MyValue'

为了知道会考虑哪些指标由左边读到你的综合指数到右列。 如果列没有在您的查询存在你读都在你的查询,则该索引将不会被使用的列前。

IDX_IndexTables_1 (VAL1,VAL2):从左至右VAL1阅读存在,这是我们所以这个指标将被视为仅列

IDX_IndexTables_2 (VAL2,VAL1):从左至右VAL2阅读并不在此查询存在,所以它不会被使用。



Answer 4:

以前的答案描述了如何使用每个索引的第一列。 (在where子句)。

我认为这是同样重要的是指出,第二列是有用的,因为它可能会增加,涉及的第二列的查询性能。

下面的查询将仅使用索引查找上IDX_1,节省了宝贵的查找到基表(因为VAL2已经是该指数的一部分)完成。

SELECT val2 from IndexTables where val1 = @someVal1

同样,反向指数将优化这个查询:

SELECT val1 from IndexTables where val2 = @someVal2

但是,只有一个(这并不重要),这两个指标是需要优化以下查询:

SELECT val1, val2 from IndexTables where val1 = @someVal1 and val2 = @someVal2

这表明,这取决于你的表收到的查询,有可能是一个正当的理由有两个指标。



Answer 5:

其他人都回答说,他们是不同的,我同意。

我虽然会增加一些其他的想法?

  • 在(COL1,COL2)指数是指你不需要在col1的索引独
  • 在(COL2,COL1)指数是指你不需要COL2上的索引独
  • 顺序的问题,如果这是覆盖(例如在上COL1,COL2 SELECT)
  • 的方向(ASC / DESC)也很重要( 其它问题1 , 其它的问题2 )


文章来源: Difference between 2 indexes with columns defined in reverse order