在索引列上使用ORDER BY

时间:2010-11-12 12:01:26

标签: sql sql-server sql-order-by

在SQL Server 2008中,假设我在Employees表上有一个索引(LastName,FirstName)。索引在两列上按ASC排序。以下查询中的ORDER BY是否有任何意义?

SELECT   LastName, FirstName
FROM     Employees
ORDER BY LastName, FirstName

查询分析器是否足够智能以省略ORDER BY,因为数据已按索引排序?或者总是指定所需的顺序更安全吗?

聚苯乙烯。我不打算进入“微观优化” - 只是更好地理解这种情况下发生的事情。

更多信息:

为了测试这个理论,我随机添加了一些数据,创建了一个省略了ORDER BY的查询,并且结果是有序的。

3 个答案:

答案 0 :(得分:6)

,您不能省略订单。

如果没有特别订购,则无法保证记录的退货顺序。

看看

Order of Result Set of SELECT Statement on Clustered Indexed Table When ORDER BY is Not Used

答案 1 :(得分:1)

即使必须使用ORDER BY子句来获取结果,但SQL优化器足够聪明,可以使用索引进行此操作。 检查执行计划,你会发现只使用索引而不是基表,操作也不会花费太多时间,因为记录是从已经排序的索引中提取的。

答案 2 :(得分:1)

只是想提一下旁观者答案中所列文章中的一条评论,我觉得这很有意思......

Create view foobar 
as 
select top 100 percent * from foo order by bar 

select * from foobar 

上述语句不是foo的排序结果集。您没有询问订单,因此查询计划实际上可以从视图中删除订单请求。即使此DID适用于某些较旧版本的SQL Server,也不是预期的结果。您没有在最终查询中要求订单,这意味着在将结果返回给您之前无需订购结果...