create index中不同的列顺序

时间:2014-02-23 07:35:54

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012

我想在Column1和Column2中的SQL Server中创建索引在MyTable上执行查询的性能中,下面的查询有什么区别:

CREATE NONCLUSTERED INDEX [IX_1] ON [dbo].[MyTable] 
(
    [Column1] ASC,
    [Column2] ASC
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [IX_2] ON [dbo].[MyTable] 
(
    [Column2] ASC,
    [Column1] ASC
)ON [PRIMARY]

2 个答案:

答案 0 :(得分:2)

TomTom是正确的,但让我详细说明他的答案。请考虑以下查询

SELECT * FROM MyTable WHERE Column1 = ? AND Column2 = ?; /* IX_1 will be used */
SELECT * FROM MyTable WHERE Column2 = ? AND Column1 = ?; /* IX_1 will be used */ 
SELECT * FROM MyTable WHERE Column1 = ?; /* IX_1 will be used */

只要在WHERE子句中提供两列索引顺序无关紧要。 SQL服务器将自行决定。考虑以下条件。

  • 索引的所有列。
  • 索引的第一列。

但是

SELECT * FROM MyTable WHERE Column2 = ? /* IX_2 will be used */

对于上述查询,MSSQL将使用您的第二个索引。

答案 1 :(得分:0)

  

以下查询有什么区别:

订单?明显。

这有影响。

查询是针对条件中的Column2而且有一个索引Column1,然后是Column2 - 不会使用索引。

因此,多行索引仅在它们所针对的查询具有相同顺序的相同行时才有用。您可以错过查询中的行,但只会使用“最后”和索引,但是开头的字段....表示不使用索引。