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 5SQL2:
SELECT TOP 4 *
FROM 表名
WHERE 工资>=700
ORDER BY 工资 DESC
查询结果是:
名字 工资 ID
王八 800 5
田七 700 4
孙六 700 3
赵五 700 2
很明显,赵五,孙六,田七都进行了倒叙。
(技术文章好难写,一个意思想到了却难以表达清楚真让人抓狂。唉,估计现在也有人没看懂,我表达能力不行啊)