SQL SERVER中 ORDER BY也会偷懒

首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

SQL SERVER中 ORDER BY也会偷懒

作者:  时间: 2011-05-24

当使用TOP N(不加ORDER BY)时,SQLSERVER不会对数据做任何分析,到了N个直接截断。

但如果你加上ORDER BY,也不一定会进行排序,因为SQLSERVER只在你WHERE子句限制的字段的值是不唯一的情况下排序。

我举个例:比如你有一个表如下:

名字   工资     ID

张三    500     0

李四    600     1

赵五    700     2

孙六    700     3

田七    700     4

王八    800     5

如果SQL语句是:

SELECT TOP 2 *

FROM 表名

WHERE 工资=700

则出来的结果是:

名字   工资     ID

赵五    700     2

孙六    700     3

若SQL换成:

SELECT TOP 2 *

FROM 表名

WHERE 工资=700

ORDER BY 工资 DESC

本以为这次孙六要排在赵五前面了,

结果查询出来的结果没有变化,

看了下执行计划:

发现根本没进行排序操作。

原来SQLSERVER也会偷懒,

发现WHERE子句中约束字段的值一样时,就跳过了排序!

为了进行验证,我又写了这样两句SQL:

SQL1:

SELECT TOP 4 *

FROM 表名

WHERE 工资>=700

查询结果是:

名字   工资     ID

赵五    700     2

孙六    700     3

田七    700     4

王八    800     5

SQL2:

SELECT TOP 4 *

FROM 表名

WHERE 工资>=700

ORDER BY 工资 DESC

查询结果是:

名字   工资     ID

王八    800     5

田七    700     4

孙六    700     3

赵五    700     2

 

很明显,赵五,孙六,田七都进行了倒叙。

(技术文章好难写,一个意思想到了却难以表达清楚真让人抓狂。唉,估计现在也有人没看懂,我表达能力不行啊)