在sql server中创建索引时,列顺序如何重要?

在sql server中创建索引时,列顺序如何重要?,sql,sql-server,tsql,query-optimization,sql-execution-plan,Sql,Sql Server,Tsql,Query Optimization,Sql Execution Plan,我已经在两列上创建了一个表EMP name varchar10、address varchar10和两个索引,唯一的区别是列的顺序发生了变化。Index1name,address和index2adress,name和我从emp运行select*,其中name=和address=使用了index2,这很明显,然后我刷新了缓存,甚至重新启动了我的sql服务,将顺序更改为select*,从emp中选择,其中address=和name=an,这次我认为将使用index1,但它使用了相同的索引index2

我已经在两列上创建了一个表EMP name varchar10、address varchar10和两个索引,唯一的区别是列的顺序发生了变化。Index1name,address和index2adress,name和我从emp运行select*,其中name=和address=使用了index2,这很明显,然后我刷新了缓存,甚至重新启动了我的sql服务,将顺序更改为select*,从emp中选择,其中address=和name=an,这次我认为将使用index1,但它使用了相同的索引index2

现在第二件事-我删除了这个表,重新创建了同一个表,只是有一点不同,我先创建了index2,然后按照上面相同的顺序创建了index1,并从case1执行相同的过程,这次它使用了index1


问题是-在这种情况下,过滤器的顺序是否无关紧要?它总是考虑到最终创建的索引,我的理解是它从右到左读取执行,但这里不是这样的情况?

对于您的特定查询,可以使用任何一个索引。SQL Server任意选择其中一个—我认为不存在对其中一个的偏好

另一方面,如果您有这样的查询:

where name = ? and address like 'A%'
where address = ? and name like 'A%'
那么最好的索引是名称、地址

或者像这样:

where name = ? and address like 'A%'
where address = ? and name like 'A%'
那么最好的索引是地址、名称


WHERE中的比较顺序独立于索引使用情况,除非基于优化器中等效索引的顺序存在一些无意义的影响。

据我所知,列的顺序不应在索引使用/创建中发挥作用。您可能需要仔细检查您当前的基准测试,以及您使用的数据的大小/类型等。请阅读和阅读类似的主题。所选索引不是基于创建索引的顺序,而是基于可能覆盖查询索引的各个索引的基数。这就是为什么保持索引统计信息相对最新很重要的原因,否则CE可能会根据旧数据做出错误的决定。我认为您在第一个示例中有一个输入错误这是假设name=?比像“A%”这样的地址更有选择性,因为两个谓词都可以使用索引。@DavidBrowne Microsoft。很难想象在这种情况下会使用地址或地址、名称索引,而不是名称、地址索引。如果数据库中只有一个名称,那么优化器可能会给索引赋予相等的权重。@seanb。我没看到打字错误。你指的是什么?错别字是两个查询的索引都列为“最佳”。我刚刚指出,索引的选择取决于两个谓词的选择性。在其他场景中,“like”谓词可能更具选择性。