where 子句中的列顺序应该与索引顺序相同吗?

Ega*_*ian 9 sql-server-2008 sql-server

我正在阅读这个 use-the-index-luke.com,它详细解释了索引的工作原理。此人重申的一件事是索引的顺序很重要,并且为了使查询快速,where 子句列应该与索引中的列相同。今天,我只是证实了这个理论并在 SQL Server 2008 上创建了一个表(id int ,name nvarchar(100) )。我在其中插入了一些 5000 行并创建了一个索引 create index abc on test (name, id )

并触发了查询

select ID, name 
from test 
where ID = 10
and name = '10'
Run Code Online (Sandbox Code Playgroud)

我期待全表扫描后跟查询计划中的选择,但令我惊讶的是计划的输出是选择后的索引扫描。 查询计划

所以,我的问题是 Where 子句中的列顺序重要还是 SQL Server 根据索引定义重新排列它们?

谢谢 !!

a_h*_*ame 13

所以,我的问题是 Where 子句中的列顺序是否重要

WHERE不。子句中列的顺序根本无关紧要。


Jon*_*gel 10

首先,DROP查询窗口中的语句显然没有执行,但是为了解释起见,我会尝试解决您的问题。


将索引想象成电话簿:条目按姓氏排序,然后按名字排序。(这是索引键顺序。)

如果我让你找出姓氏为“Davis”的人的所有电话号码,你会翻到相应的页面,然后读出这些号码。(这是一个索引查找。)

如果我要求您查找名字为“Janice”的人的所有电话号码,您将必须查看每一页才能找到所有这些人。(这是一个索引扫描。)

如果我给你一个名字和一个姓氏,你将能够很快找到那个条目,就像第一个例子一样,因为很明显你会使用姓氏来找到正确的页面,然后用名字来查找找到确切的条目。我给你信息的顺序无关紧要,只要我给了你一个名字和一个姓氏。

SQL Server 查询优化器的工作方式相同。无论WHERE子句中条件的顺序如何,它都会根据索引键顺序自动确定检索您要求的数据的最有效方式。