上一篇 | 下一篇

SQL语句优化技术分析

发布: 2008-7-01 14:14 | 作者: admin | 来源: | 查看: 0次

SQL语句优化技术分析

【字体:小 大】

SQL语句优化技术分析

作者:- 文章来源:- 点击数:1181 更新时间:2006-5-12

   以上四个 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 sysdate+1 )

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

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

   ‘X'||hbs_bh>'X 5400021452' ,优化处理: 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 )(使用提示的表索引进行查询)

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

   ORACLE 的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给 ORACLE

字号: | 推荐给好友

32/3<123>

评分:0

我来说两句