在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1:在进行多表关联时,多用 Where 语句把单个表的结果集最小化,多用聚合函数汇总结果集后再与其它表做关联,以使结果集数据量最小化 复制代码 代码如下: 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 10 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的执行频率。 11: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占用率明显比第一条低。 12:询表顺序的影响 在FROM后面的表中的列表顺序会对SQL执行性能影响,在没有索引及ORACLE没有对表进行统计分析的 情况下ORACLE会按表出现的顺序进行链接, 由此因为表的顺序不对会产生十分耗服务器资源的数据交叉。(注:如果对表进行了统计分析, ORACLE会自动先进小表的链接,再进行大表的链接) 13:采用函数处理的字段不能利用索引,如: 复制代码 代码如下: substr(hbs_bh,1,4)='5400',优化处理:hbs_bh like ‘5400%' trunc(sk_rq)=trunc(sysdate),优化处理: sk_rq>=trunc(sysdate) and sk_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' and kh_bh='250000' 14:应用ORACLE的HINT(提示)处理 提示处理是在ORACLE产生的SQL分析执行路径不满意的情况下要用到的。它可以对SQL进行以下方 面的提示 目标方面的提示: COST(按成本优化) RULE(按规则优化) CHOOSE(缺省)(ORACLE自动选择成本或规则进行优化) SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; ALL_ROWS(所有的行尽快返回) SELECT EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO='SCOTT'; FIRST_ROWS(第一行数据尽快返回) select * from xxx where xxx; select * from xxx where xxx 优化器提示:用它的目的是提高SQL语句的响应时间,快速的先返回 n 行。 访问路径的提示 FULL: 执行全表扫描 ROID: 根据ROWID进行扫描 INDEX: 根据某个索引进行扫描 select * from emp where deptno=200 and sal>300; 如果写了多个,则ORACLE自动选择最优的哪个 select * from emp where deptno=200 and sal>300; INDEX_JOIN: 如果所选的字段都是索引字段(是几个索引的),那么可以通过索引连接就可访问到数据,而不需要访问 表的数据。 select deptno,sal from emp where deptno=20; INDEX_FFS: 执行快速全索引扫描 select count(*) from emp; NO_INDEX: 指定不使用哪些索引 select * from emp where deptno=200 根据表出现在FROM中的顺序,ORDERED使ORACLE依此顺序对其连接. 将指定的表与其他行源通过合并排序连接方式连接起来. |
请发表评论