Oracle sql 语句分析
时间:2007-12-23 来源:不详 作者:迈克DB
WHERE后面的条件顺序影响
WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如
Select*fromzl_yhjbqkwheredy_dj=’1KV以下’andxh_bz=1
Select*fromzl_yhjbqkwherexh_bz=1anddy_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_bhlike‘5400%’
trunc(sk_rq)=trunc(sysdate),优化处理:
内容来自dedecms
sk_rq>=trunc(sysdate)andsk_rq<trunc(sysdate 1)
进行了显式或隐式的运算的字段不能进行索引,如:
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’andkh_bh=’250000’
应用ORACLE的HINT(提示)处理
提示处理是在ORACLE产生的SQL分析执行路径不满足的情况下要用到的。它可以对SQL进行以下方面的提示
目标方面的提示:
COST(按成本优化)
RULE(按规则优化)
CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化)
ALL_ROWS(所有的行尽快返回)
FIRST_ROWS(第一行数据尽快返回)
执行方法的提示:
USE_NL(使用NESTEDLOOPS方式联合)
USE_MERGE(使用MERGEJOIN方式联合)
USE_HASH(使用HASHJOIN方式联合)
索引提示:
本文来自织梦
INDEX(TABLEINDEX)(使用提示的表索引进行查询)
其它高级提示(如并行处理等等)
ORACLE的提示功能是比较强的功能,也是比较复杂的应用,并且提示只是给ORACLE执行的一个建议,有时假如出于成本方面的考虑ORACLE也可能不会按提示进行。根据实践应用,一般不建议开发人员应用ORACLE提示,因为各个数据库及服务器性能情况不一样,很可能一个地方性能提升了,但另一个地方却下降了,ORACLE在SQL执行分析方面已经比较成熟,假如分析执行的路径不对首先应在数据库结构(主要是索引)、服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息是否正确这几方面分析。
上一篇:怎样在My SQL中直接储存图片 下一篇:Oracle 常用技巧和脚本
文章评论
共有位Admini5网友发表了评论 查看完整内容