开发者

Using ORDER BY on indexed columns

开发者 https://www.devze.com 2023-01-24 13:41 出处:网络
In SQL Server 2008, let\'s say I have an index (LastName, FirstName) on the table Employees. The index is sorted ASC on both columns. Is there any point to the ORDER BY in the following query?

In SQL Server 2008, let's say I have an index (LastName, FirstName) on the table Employees. The index is sorted ASC on both columns. Is there any point to the ORDER BY in the following query?

SELECT   LastName, FirstName
FROM     Employees
ORDER BY LastName, FirstName

Is the query analyzer smart enough to omit the ORDER BY since the data is already ordered per the indexes? Or is it safer to always specify the desired ordering?

Ps. I'm not trying to get into "micro-optimizations" - just a better understanding of what 开发者_Go百科happens in this scenario.

More Info:

To test the theory, I added some data randomly, created a query that omitted the ORDER BY, and the results were ordered.


NO, you cannot omit the order by.

There is no guarantee of the order in which records return if it is not specifically ordered.

Have a look at

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


Even you must use ORDER BY clause to get the result rodered but SQL optimizer is smart enough to utilize the index for this operation. Check the execution plan and you would find that only the index is used and not the base table and the operation would also not take much time as the records are fetched from index where they are already placed ordered.


Just wanted to mention one of the comments from the article listed in astander's answer, which I found really interesting...

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

select * from foobar 

The above statement will not be a sorted resultset from foo. You did not ASK for an order, so the query plan can actually drop the order request from the view. Even if this DID work on some older Versions of SQL Server, it is not an expected result. You didn't ask for an order in your final query, that means there is no need to order the result before returning it to you…

0

精彩评论

暂无评论...
验证码 换一张
取 消