非得邹建出马?为何TOP的执行速度如此之高?
这是我的上篇文章的地址,回复人是不少,而且很热心,大家都有一个共同的感觉,就是无法理解,所以,我再发一次,请高手进!!
http://community.csdn.net/Expert/topic/3424/3424520.xml?temp=.8594171
如果我执行:
select top 1 * from (select top 1000 * from tgongwen where neibuyonghu='办公室' ) as a
用时:0毫秒,有5次逻辑读,0次物理读
select top 1000 * from tgongwen where neibuyonghu='办公室'
用时:0毫秒,有29次逻辑读,0次物理读。
而执行:
select * from tgongwen where neibuyonghu='办公室'
用时:16毫秒,有24676次逻辑读,0次物理读。
请问,如上结果,为何第一个语句的执行速度比第二个的子查询速度还快?难道第一个语句不是在其子查询(即第二个语句)执行完毕后才进行的吗?这样的话,第一句不应该比第二句慢才对吗?
更何况,微软的帮助上好像写的是:TOP是对查询结果进行的排序,那么,如果用TOP不应该比不用TOP慢吗?因为它的前提是查询完毕后再进行抽取前多少个啊?
TOP和SET ROWCOUNT有何本质区别?
谢谢,
另外,不可思议的是:
select * from (select TOP 10000 gid,fariqi,neibuyonghu,reader,title from Tgongwen
order by fariqi) as a order by gid
用时:180毫秒
而执行其中的自查询:
select TOP 10000 gid,fariqi,neibuyonghu,reader,title from Tgongwen
order by fariqi
还需要用203毫秒
这是为何?
问题点数:0、回复次数:9Top
1 楼hdhai9451(☆新人类☆)回复于 2004-10-04 09:28:53 得分 0
//用时:180毫秒
//还需要用203毫秒
------------------------
1.兩次用的時間相差不是很大﹐還不能真正說明什么﹖歷為查詢要與服務器的閑與忙有關系﹐如果服務器忙的時候﹐當然用的時間會多一點。
2.每一次你用order by gid﹐第二次用order by fariqi ﹐兩次排序的字段不一樣﹐也會對查詢的時間有所影響
Top
2 楼hdhai9451(☆新人类☆)回复于 2004-10-04 09:30:14 得分 0
上面"每一次"改為"第一次"Top
3 楼Happiness(乐乐)回复于 2004-10-04 09:33:30 得分 0
说明表的聚集索引,索引情况
select top 1 * from (select top 1000 * from tgongwen where neibuyonghu='办公室' ) as a
实际执行应该和
select top 1 * from tgongwen where neibuyonghu='办公室'
相同
当然比
select top 1000 * from tgongwen where neibuyonghu='办公室'
快
Top
4 楼hdhai9451(☆新人类☆)回复于 2004-10-04 09:36:00 得分 0
//请问,如上结果,为何第一个语句的执行速度比第二个的子查询速度还快?难道第一个语句不是在其子查询(即第二个语句)执行完毕后才进行的吗?
----------------------------------------
第一个雖然它有個子查詢﹐但是它對子查詢的結果只取出一條記錄﹐而第二个雖然沒有子查詢﹐但是它要取出1000條記錄﹐因為第二次要讀取出的記錄數多﹐所以用的時間當然會多
Top
5 楼zjcxc(邹建)回复于 2004-10-04 14:22:18 得分 0
--1.
select top 1 * from (
select top 1000 * from tgongwen where neibuyonghu='办公室' ) as a
--2.
select top 1000 * from tgongwen where neibuyonghu='办公室'
--3.
select * from tgongwen where neibuyonghu='办公室'
这三句没有什么可比性,因为这三句返回的结果集是不一样的
第3句执行时间长,这个很容易理解的,它返回的记录最多
对于1,2这两句,第一句,它只返回一条记录,SQL会根据你的表结构进行优化,最终的优化结果可能是:
select top 1 * from tgongwen where neibuyonghu='办公室'
所以它的速度最快,另外,返回结果集的话,还要从数据库中提出数据并返回给调用者,这也需要耗用资源
Top
6 楼zjcxc(邹建)回复于 2004-10-04 14:23:02 得分 0
--对于:
select * from (
select TOP 10000 gid,fariqi,neibuyonghu,reader,title
from Tgongwen
order by fariqi
) as a order by gid
--与
select TOP 10000 gid,fariqi,neibuyonghu,reader,title
from Tgongwen
order by fariqi
你应该多执行几次,取平均执行时间,单次的查询说明不了问题.Top
7 楼btut2004(养鱼炒股)回复于 2004-10-04 15:02:17 得分 0
难道第一个语句不是在其子查询(即第二个语句)执行完毕后才进行的吗?
a:我认为不是的,是优化后的结果
更何况,微软的帮助上好像写的是:TOP是对查询结果进行的排序,那么,如果用TOP不应该比不用TOP慢吗?因为它的前提是查询完毕后再进行抽取前多少个啊?
a:我认为如果有聚集索引也慢不到哪里去
TOP和SET ROWCOUNT有何本质区别?
a:不太清楚
最后一个
a:像老大说的,多试几次
Top
8 楼fengyun14(along)回复于 2004-10-04 15:03:24 得分 0
我是发文者!谢谢
我想问TOP的工作原理,比如:
select TOP 100 * from tgongwen where neibuyonghu='办公室' order by gid
假设如果没有TOP 100,那么这个where语句可以查出500条记录,那么是否是SQL SERVER是先查出全部的500条记录,然后放在内存中,在然后根据GID挑出前100条呢?还是直接由数据库就查100条记录就停止工作,根本没有找到500条?
如果是将这500条记录存放在内存中的话,它对计算机的内存是否有要求呢?对最终的查询速度是否有影响呢?
谢谢,非常!!
Top
9 楼btut2004(养鱼炒股)回复于 2004-10-04 15:15:07 得分 0
我认为是先优化,对于一个复杂的查询你也不知道优化器是怎么做的。
对于你的这个查询:可是说是不会查500条的。
Top




