就业数据资源平台
当前位置:首页 > 数据库技术
如何学习sql语句优化(2)

 以上四个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占用率明显比第一条低。


  查询表顺序的影响


  在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的情况下ORACLE会按表出现的顺序进行链接,由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析,ORACLE会自动先进小表的链接,再进行大表的链接)


  SQL语句索引的利用


  对操作符的优化(见上节)


  对条件字段的一些优化


  采用函数处理的字段不能利用索引,如:


  substr(hbs_bh,1,4)=’5400’,优化处理:hbs_bh like ‘5400%’


  trunc(sk_rq)=trunc(sysdate), 优化处理:


  sk_rq>=trunc(sysdate) and sk_rq

  进行了显式或隐式的运算的字段不能进行索引,如:


  ss_df+20>50,优化处理:ss_df>30


  ‘X’||hbs_bh>’X5400021452’,优化处理:hbs_bh>’5400021542’


  sk_rq+5=sysdate,优化处理:sk_rq=sysdate-5


  hbs_bh=5401002554,优化处理:hbs_bh=’ 5401002554’,注:此条件对hbs_bh 进行隐式的to_number转换,因为hbs_bh字段是字符型。


  条件内包括了多个本表的字段运算时不能进行索引,如:


  ys_df>cx_df,无法进行优化


  qc_bh||kh_bh=’5400250000’,优化处理:qc_bh=’5400’ and kh_bh=’250000’


  应用ORACLE的HINT(提示)处理


  提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方面的提示


  目标方面的提示:


  COST(按成本优化)


  RULE(按规则优化)


  CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)


  ALL_ROWS(所有的行尽快返回)


  FIRST_ROWS(第一行数据尽快返回)


  执行方法的提示:


  USE_NL(使用NESTED LOOPS方式联合)


  USE_MERGE(使用MERGE JOIN方式联合)


  USE_HASH(使用HASH JOIN方式联合)


  索引提示:


  INDEX(TABLE INDEX)(使用提示的表索引进行查询)


  其它高级提示(如并行处理等等)

就业数据资源平台