CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  应用实例

非得邹建出马?为何TOP的执行速度如此之高?

楼主fengyun14(along)2004-10-04 08:58:25 在 MS-SQL Server / 应用实例 提问

这是我的上篇文章的地址,回复人是不少,而且很热心,大家都有一个共同的感觉,就是无法理解,所以,我再发一次,请高手进!!  
  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

相关问题

  • 请邹建大哥帮我看看 存储过程执行太慢 怎样提高执行速度
  • 请邹健等高手救命啊!SQL语句的执行速度问题!
  • C#执行速度问题
  • 指令执行速度
  • SQL执行速度问题
  • DLL的执行速度比较问题
  • ADOExpress的执行速度问题??(很急)
  • Union 后执行速度变慢!
  • (新手问题)执行速度问题
  • 程序执行速度太快~~~~~~

关键词

  • 查询
  • 语句
  • 执行
  • top
  • 优化
  • 逻辑
  • 物理
  • 内存
  • 時間
  • 办公室

得分解答快速导航

  • 帖主:fengyun14

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo