海量数据库查询优化及分页算法(七)

日期: 2008-08-06 作者:晴穹 来源:TechTarget中国 英文

  前面,我们谈到,如果在like前面加上通配符%,那么将会引起全表扫描,所以其执行效率是低下的。但有的资料介绍说,用函数charindex()来代替like速度会有大的提升,经我试验,发现这种说明也是错误的:







select gid,title,fariqi,reader from tgongwen where charindex(’刑侦支队’,reader)>0 and fariqi>’2004-5-5’ 

  用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。







select gid,title,fariqi,reader from tgongwen where reader like ’%’ + ’刑侦支队’ + ’%’ and fariqi>’2004-5-5’ 

  用时:7秒,另外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。


  8、union并不绝对比or的执行效率高


  我们前面已经谈到了在where子句中使用or会引起全表扫描,一般的,我所见过的资料都是推荐这里用union来代替or。事实证明,这种说法对于大部分都是适用的。







select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=’2004-9-16’ or gid>9990000 

  用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。






select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=’2004-9-16’ 
union 
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid>9990000 


  用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。


  看来,用union在通常情况下比用or的效率要高的多。


  但经过试验,笔者发现如果or两边的查询列是一样的话,那么用union则反倒和用or的执行速度差很多,虽然这里union扫描的是索引,而or扫描的是全表。







select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=’2004-9-16’ or fariqi=’2004-2-5’ 


  用时:6423毫秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。







select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=’2004-9-16’ 
union 
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where fariqi=’2004-2-5’ 


  用时:11640毫秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。


  9、字段提取要按照“需多少、提多少”的原则,避免“select *”


  我们来做一个试验:







select top 10000 gid,fariqi,reader,title from tgongwen ord 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

晴穹
晴穹

相关推荐