对数据库技术的热爱是我唯一的安慰,毕竟这是自己喜欢的事情,还可以做下去。

因为客户项目的需要,我又开始接触Oracle,大部分工作在工作流的优化和业务数据的排查上。为了更好的做这份工作,我有参考过oracle达人,Oracle.10g性能分析与优化思路,基于海量数据的数据库设计与优化等书籍,以及案例学习SQL优化的视频等。基本上我工作中接触的主要是Oracle SQl的优化,基于长时间做SQL优化工作,现对Oracle的SQL优化做一下自己的总结。

已知,Oracle10G以后执行计划使用基于CBO: Cost-Based Optimization 基于代价的优化器。当然在oracle 10G运行的SQL执行计划肯定是系统以为的最优了,很多时候没有办法看出优化点,不管怎么改都不比原来的性能好。怎么办呢?我每次还是傻傻的看着执行计划研究半天,很多时候这是不需要的,或者是有更快的方法发现问题所在。

当然,每个人习惯和优化思路都会有不同,优化问题的处理也会不同。基于最近我优化一个程序的四个修改点,程序有原来的7个小时左右缩短为1小时左右执行。总结下我的步骤和优化思路。

1、直接观察表的数据量和表结构属性,不拘泥考虑执行计划的最优  (大数据表利用全表 Hash关联)

简写原SQL:

SELECT count(1) 
FROM Z_MID_R3_BOM_ORG1 A
WHERE trunc(a.DATUV)<=trunc(sysdate) and trunc(a.DATUB) >=trunc(sysdate)
and exists (select 1 from rpt_fp_shortage_order c
where instr(a.name,c.mtm)>0
and a.werks= c.siteid)
and exists (select 1 from mst_bomcomponentsalt b
where INSTR(b.bomid,a.name)>0
and a.idnrk=b.ALTERNATEITEM
and a.werks=b.siteid);

实际这条SQL的结果集大概在20多万条记录,结果集插入另外一张表。Z_MID_R3_BOM_ORG1表和MST_BOMCOMPONENTSALT 表的数据量在一百多万条记录,RPT_FP_SHORTAGE_ORDER 表的数据量在7000条左右。

执行计划:

SELECT STATEMENT  ALL_ROWSCost: 2,595  Bytes: 64  Cardinality: 1              
    5 FILTER          
        1 TABLE ACCESS FULL TABLE PRDABPPCDB.Z_MID_R3_BOM_ORG1 Cost: 1,198  Bytes: 55,616  Cardinality: 869      
        2 TABLE ACCESS FULL TABLE PRDABPPCDB.RPT_FP_SHORTAGE_ORDER Cost: 3  Bytes: 17  Cardinality: 1      
        4 TABLE ACCESS BY INDEX ROWID TABLE PRDABPPCDB.MST_BOMCOMPONENTSALT Cost: 91  Bytes: 48  Cardinality: 1      
            3 INDEX FAST FULL SCAN INDEX PRDABPPCDB.S9525213703_2688 Cost: 3  Cardinality: 195  
由执行计划可知,PRDABPPCDB.MST_BOMCOMPONENTSALT 表使用快速索引扫描,看似已经是最优。能利用的表属性索引已经使用了。但是近20万条记录,观察日志发现这一步骤插入的时间用了快2个小时。利用全表 Hash关联,修改后插入表的时间约为3分钟内执行完。

修改后的SQL:

SELECT count(1) 
FROM Z_MID_R3_BOM_ORG1 A
WHERE trunc(a.DATUV)<=trunc(sysdate) and trunc(a.DATUB) >=trunc(sysdate)
and exists (select 1 from rpt_fp_shortage_order c 
where instr(a.name,c.mtm)>0
and a.werks= c.siteid)
and exists (select /*+FULL(B)*/ 1 from mst_bomcomponentsalt b
where INSTR(b.bomid,a.name)>0
and a.idnrk=b.ALTERNATEITEM
and a.werks=b.siteid);

修改后的执行计划:
Plan
SELECT STATEMENT  ALL_ROWSCost: 8,748  Bytes: 111  Cardinality: 1                  
    6 SORT AGGREGATE  Bytes: 111  Cardinality: 1              
        5 FILTER          
            3 HASH JOIN SEMI  Cost: 8,676  Bytes: 111  Cardinality: 1      
                1 TABLE ACCESS FULL TABLE PRDABPPCDB.Z_MID_R3_BOM_ORG1 Cost: 2,493  Bytes: 107,280  Cardinality: 1,788  
                2 TABLE ACCESS FULL TABLE PRDABPPCDB.MST_BOMCOMPONENTSALT Cost: 6,172  Bytes: 52,636,539  Cardinality: 1,032,089  
            4 TABLE ACCESS FULL TABLE PRDABPPCDB.RPT_FP_SHORTAGE_ORDER Cost: 72  Bytes: 4,389  Cardinality: 133  

2、拆分SQL,分段执行观察整个SQL语句的block,有针对性优化

此处的优化是在表z_dim_product (数据量20万左右)上建立函数索引,lpad(product,18,'0')

简写SQL:

SELECT MAX (hier11_code)
FROM z_dim_product
WHERE substr(product,length(product)-9,10) =  b.ITEM  (b 表是另一个关联表)

修改后的SQL:

SELECT MAX (hier11_code)
FROM z_dim_product
WHERE lpad(product,18,'0') =  lpad(b.ITEM,18,'0')

3、大表优化充分利用分区和分区的索引

4、从业务角度调整逻辑,改写SQL,这种方法往往是所有优化里效果最明显的。

..........

后面3\4 的方法没有再上传SQL,有时间会继续记录个人的优化总结

Oracle SQl优化总结的更多相关文章

  1. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  2. oracle sql 优化大全

    转自: http://panshaobinsb.iteye.com/blog/1718233 http://yulimeander.blog.sohu.com/115850824.html 最近遇到了 ...

  3. Oracle SQL 优化原则(实用篇)

    由于SQL优化优化起来比较复杂,并且还受环境限制,在开发过程中,写SQL必须遵循以下几点原则: 1.Oracle 采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他Where ...

  4. oracle sql优化

    整理一下网上所看到sql优化方法 1.使用大写字母书写sql,因为oracle解释器会先将sql语句转换成大写后再解释 2    减少访问数据库的次数,多数情况下一条sql可以达到目的的,就不要使用多 ...

  5. Oracle SQL优化一(常见方法)

    1.表访问方式优化: a)普通表优先“Index Lookup 索引扫描”,避免全表扫描 大多数场景下,通过“Index Lookup 索引扫描”要比“Full Table Scan (FTS) 全表 ...

  6. oracle sql优化笔记

    oracle优化一般分为:1.sql优化(现在oracle都会根据sql语句先进行必要的优化处理,这种应该用户不大了,但是像关联和嵌套查询肯定是和影响性能的) A.oracle的sql语句的条件是从右 ...

  7. Oracle SQL优化器简介

    目录 一.Oracle的优化器 1.1 优化器简介 1.2 SQL执行过程 二.优化器优化方式 2.1 优化器的优化方式 2.2 基于规则的优化器 2.3 基于成本的优化器 三.优化器优化模式 3.1 ...

  8. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  9. Oracle SQL 优化规则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

随机推荐

  1. PHP编译安装系列

    徐亮伟, 江湖人称标杆徐.多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作.擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作. 个人博客"徐亮伟架构师之路&quo ...

  2. Android基础之布局ConstraintLayout

    Google I/O 2016 上发布了 ConstraintLayout,据说很强大,那就一探究竟吧! gradle配置 compile 'com.android.support.constrain ...

  3. System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") 显示24小时制;System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")显示12小时制

    this.Label6.Text = "当前时间:" + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") ...

  4. DataSnap 连接池

    二. DataSnap连接池 连接池 http://docwiki.embarcadero.com/Libraries/XE8/en/Datasnap.DSSession.TDSSessionMana ...

  5. android 积累

    图片资源 图片资源是简单的Drawable资源,目前Android支持的图片格式有:gif.png.jpg等.我们只需要把图片资源放置到\res\drawable目中,那么在编译后的R.java类中就 ...

  6. (转存 作者未知)深入理解HTML协议

    深入理解HTML协议 http协议学 习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Worl ...

  7. Struts2结果页面配置(Result)

    1.全局页面配置 全局结果页面:针对一个包下的所有Action的页面跳转都可生效 <global-results> <result name="xxx">/ ...

  8. 通过devtools在centos系统中启用高版本的gcc

    C++11出来好久了,现在还是使用c++03的,需要在centos6.6的系统上实现gcc的升级,又不想自己编译代码. 于是选用了devtoolsset系列,安装脚本如下 安装脚本如下 functio ...

  9. 文件后缀与mime类型对应表

    //文档文件类型的 .ai application/postscript    .eps application/postscript    .exe application/octet-stream ...

  10. OSG QT

    https://blog.csdn.net/a_Treasure/article/details/82152245 https://www.bbsmax.com/A/kPzOQ4oo5x/ https ...