我想在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]
答案 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 - 不会使用索引。
因此,多行索引仅在它们所针对的查询具有相同顺序的相同行时才有用。您可以错过查询中的行,但只会使用“最后”和索引,但是开头的字段....表示不使用索引。