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

因为客户项目的需要,我又开始接触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. sysbench基准测试(2)——oltp.lua测试

    前面知道sysbench基准测试的主要步骤为:prepare(准备数据集)→ run(运行测试)→ cleanup(清除数据集) 这一节介绍oltp.lua测试. oltp基准测试模拟了一个简单的事物 ...

  2. 跟我学算法聚类(kmeans)

    kmeans是一种无监督的聚类问题,在使用前一般要进行数据标准化, 一般都是使用欧式距离来进行区分,主要是通过迭代质心的位置 来进行分类,直到数据点不发生类别变化就停止, 一次分类别,一次变换质心,就 ...

  3. Shiro 权限校验不通过时,区分GET和POST请求正确响应对应的方式

    引入:https://blog.csdn.net/catoop/article/details/69210140 本文基于Shiro权限注解方式来控制Controller方法是否能够访问. 例如使用到 ...

  4. OrderedDict 有序字典以及读取json串时如何保持原有顺序

    1. OrderedDict 有序字典 OrderedDict是dict的子类,它记住了内容添加的顺序.比较时,OrderedDict要内容和顺序完全相同才会视为相等 import collectio ...

  5. 不同应用场景的10个Linux面试问题与解答

    本文由 极客范 - 小道空空 翻译自 Avishek Kumar.欢迎加入极客翻译小组,同我们一道翻译与分享.转载请参见文章末尾处的要求. 这一次我们不再介绍某个特定主题的Linux面试问题,而是随机 ...

  6. 火狐浏览器的RestClient,接口测试,Post提交数据

    昨天需要测试接口是不是调通,api中本身已经集成了测试,但加了OAuth,api有没有添加头文件,Headers的地方,所以想用RESTClient的Post提交重新测试下,但是,调了好几个小时都没有 ...

  7. spring是什么

    spring是一个容器,用于降低代码间的耦合度,根据不同的代码采用了ioc和aop这二种技术来解耦合. 比如转账操作:a用户少1000,b用户多1000.这是主业务逻辑   IOC 涉及到的事务,日志 ...

  8. Linux实战教学笔记32:企业级Memcached服务应用实践

    一, Memcached介绍 1.1 Memcached与常见同类软件对比 (1)Memcached是什么? Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共 ...

  9. 一道容易栽坑的有趣的面试题(关于js,定时器,闭包等)

    1.首先下面代码输出什么? for (var i = 0; i < 5; i++) { console.log(i); } 输出:0 1 2 3 4 2.上面只是普通的输出,没有陷阱再看下面这个 ...

  10. Activiti 整合的小插曲

    虽然是令人头痛的小插曲,真不令人省心.2年不用它又忘了怎么配,这次一定记录下来,呵呵哒. 1.下载及运行设计器 官网下载源码压缩包,解压后找到设计器目录:Activiti-activiti-5.22. ...