科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件两个SQL语句效率,附执行时间图

两个SQL语句效率,附执行时间图

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

再发两个SQL语句效率,附执行时间图

作者:csdn 来源:csdn 2009年12月15日

关键字: 问答 ASP.NET

  • 评论
  • 分享微博
  • 分享邮件

两个SQL语句效率,附执行时间图

select  id,title from info where cityid=11 order by id desc

select  id,title from info where substring(city,1,2)='11' order by id desc

其中cityID为INT数据类型  city为varchar数据类型
其中试验1,2,3,4,5,10列为第二个SQL语句的执行结果
其中试验6,7,8,9为第一个SQL语句的执行结果

除了order by对你的测试影响之外,还有可能受数据库缓存影响,你应该把第一次运行的测试结果忽略,因为以后别人都有可能是从内存中提取数据的 
 

这个跟你的SQL 的原理有关
SQL会将一些需要编译,优化的语句进行缓存,而简单的SQL语句则不做处理

第一个SQL语句直接使用的是CityID ,这样的简单语句在SQL中属于直接就可以执行的,无需缓存,因此SQL会直接扫描索引来直接加载行。
而第二个语句中带有Substring语句,这样的语句很明显是需要占用cpu来计算的,因此在对此语句进行预编译以后,SQL会将该语句加载至缓存,以便下次使用的时候直接从内存读取,不用再次编译,所以性能会有所提高。
换句话说,第二种情况之所以会快是因为缓存的原因,如果不怕麻烦你可以每次从新启动SQL服务,或者执行SQL语句之间的间隔时间长一些,就会发现不一样的结果

而且你上面的测试只是显示出了从客户端到服务端的一些时间信息,如果你在服务器上用Profiler工具检测CPU ,IO读取等等信息的话,应该更为准确

以上根据SQL的原理来解释,实际结果以Profiler工具为准,记得保证没有缓存因素在内。

 

(1).
select  id,title from info where cityid=11 order by id desc

返回8万多条记录,所以就算是cityid上建有索引,优化器也不可能选择它,因为要搭配Bookmark LoopUp操作去取title跟id,这样的随机IO太昂贵了,还不如Clustered Index scan成本低, 所以这里应该是一个Clustered Index scan的操作

  建议CityID的索引这么建:
  Create index idx_Name ON Info (CityID) INCLUDE (id,title)

(2).
  select  id,title from info where substring(city,1,2)='11' order by id desc
  这个不用说,大家都知道索引用不上,同样是一个Clustered index scan.

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章