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


8

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

并触发了查询

select ID, name 
from test 
where ID = 10
and name = '10'

我原本希望在查询计划中进行全表扫描,然后再进行选择,但令我惊讶的是,计划的输出是选择所跟随的索引扫描。 查询计划

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

谢谢 !!


3
您测试的执行计划不是回答问题吗?
ypercubeᵀᴹ

是的!但是我想要一些专家意见,并且在某些情况下可能会失败。谢谢 !!
平等主义者2012年

1
MySQL的类似问题:在MySQL中,WHERE子句中列的顺序会影响查询性能吗?SQL-Server的优化器比MySQL高几个级别。
ypercubeᵀᴹ

Answers:


13

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

否。该WHERE子句中的列顺序根本没有关系。


10

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


就像电话簿一样考虑索引:条目按姓氏排序,然后按名字排序。(这是索引键顺序。)

如果我要求您查找姓氏为“ Davis”的所有人的所有电话号码,则可以转到相应的页面,然后读出这些号码。(这是一个索引查找。)

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

如果我同时给您一个名字和一个姓氏,您将能够像第一个示例一样迅速找到该条目,因为很明显,您将使用姓氏来找到正确的页面,然后使用名字来查找找到确切的条目。只要我给你名字和姓氏,给你信息的顺序都没关系。

SQL Server查询优化器的工作方式相同。根据索引键顺序,它会自动确定检索所需数据的最有效方法,而不WHERE管子句中条件的顺序如何。


关于索引扫描和索引查找的很好的解释。
Neelam

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.