ORACLE SQL语句优化技术分析(二)

日期: 2008-06-16 作者:yzsind 来源:TechTarget中国

   union操作符


    union在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表union。如:


    select * from gc_dfys


    union


    select * from ls_jg_dfys


    这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。


    推荐方案:采用union ALL操作符替代union,因为union ALL操作只是简单的将两个结果合并后就返回。


    select * from gc_dfys


    union all


    select * from ls_jg_dfys


    SQL书写的影响


    同一功能同一性能不同写法SQL的影响


    如一个SQL在A程序员写的为


    select * from zl_yhjbqk


    B程序员写的为


    select * from dlyx.zl_yhjbqk(带表所有者的前缀)


    C程序员写的为


    select * from DLYX.ZLYHJBQK(大写表名)


    D程序员写的为


    select *  from DLYX.ZLYHJBQK(中间多了空格)


    以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的,但是从ORACLE共享内存SGA的原理,可以得出ORACLE对每个SQL都会对其进行一次分析,并且占用共享内存,如果将SQL的字符串及格式写得完全相同则ORACLE只会分析一次,共享内存也只会留下一次的分析结果,这不仅可以减少分析SQL的时间,而且可以减少共享内存重复的信息,ORACLE也可以准确统计SQL的执行频率。


    where后面的条件顺序影响


    where子句后面的条件顺序对大数据量表的查询会产生直接的影响,如


    select * from zl_yhjbqk where dy_dj = ’1KV以下’ and xh_bz=1


    select * from zl_yhjbqk where xh_bz=1  and dy_dj = ’1KV以下’


    以上两个SQL中dy_dj(电压等级)及xh_bz(销户标志)两个字段都没进行索引,所以执行的时候都是全表扫描,第一条SQL的dy_dj = ’1KV以下’条件在记录集内比率为99%,而xh_bz=1的比率只为0.5%,在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较,而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较,以此可以得出第二条SQL的CPU占用率明显比第一条低。

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

作者

yzsind
yzsind

相关推荐