
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
