问题提出:
etl中有一过程qmsressummt0_test,用来抽取各地xxx应用的资料,目前处于测试阶段,暂时存放2个厂区一个月的测试资料,目前该过程执行一次要30分钟,按此状况,日后如再抽取其他厂区的资料,预计执行三个小时以上,小组开发人员请求协助优化。
优化前的执行情况
9:31:20 SQL> set serveroutput on;
9:31:25 SQL> exec qmsressummt0_test;
PL/SQL procedure successfully completed
10:00:54 SQL>
执行一次,耗时在30分钟
调优步骤:
步骤一:调整sql的优化器由rbo变为采用cbo方式
查看procedure涉及到table的统计信息,三个表都没有统计信息
10:33:35 SQL> select * from user_tables where table_name in ('QMS310T0','QMS311T0',UPPER('qmsressummt0'));
TABLE_NAME TABLESPACE_NAME NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE
------------------------------ --------------------------- ---------- ------------ ----------
QMS310T0 QMSS
QMS311T0 QMSS
QMSRESSUMMT0 QMSS
Oracle9i,10g的sql优化器优先采用cbo方式,cbo方式下,oracle优化器可以更智能更合理的选择执行计划,从而使sql的执行效率更高,而若相关table和index没有统计信息的话,则会转而采用传统的rbo方式,在此例子中,任意查看过程中的某个sql,发现都是采用rbo。
接下来分析该过程涉及到的三个表,收集相关统计信息。
对这三个表做分析,收集统计信息
10:00:54 SQL> analyze table qms310t0 compute statistics for table for all indexes;
Table analyzed
10:33:11 SQL> analyze table qms311t0 compute statistics for table for all indexes;
Table analyzed
10:33:21 SQL> analyze table qmsressummt0 compute statistics for table for all indexes;
Table analyzed
10:33:35 SQL>
可以试验比对一下,采用rbo和cbo的执行效率对比情况
10:41:43 SQL> exec qmsressummt0_test;
PL/SQL procedure successfully completed
11:03:37 SQL>
可以发现,现在的执行时间在20分钟,在此过程中,效率提高了接近1/3,由此,我们可以看到相同的sql语句,优化器采用cbo比采用rbo效率要提高不少。
步骤二:合理利用索引,进一步提高sql执行效率
分析procedure和table,相关的表需要建立索引,这一步需要根据以往的经验,建立相关索引(开发人员并没有考虑新增索引,甚至主键都没有),并抽取sql语句,查看索引添加前后的执行计划,最终建立的索引(主键索引)如下
SQL> alter table QMS310t0
add constraint PK1_QMS310T0 primary key (BRANCH_NO, CHECK_NO,vend_id,mtrl_no)
Using Index tablespace indx;
Table altered
SQL> alter table QMS311t0
add constraint PK1_QMS311T0 primary key (BRANCH_NO, CHECK_NO, SAMPL_NO,mtrl_no, CHK_NO)
Using Index tablespace indx ;
Table altered
SQL>alter table qmsressummt0 add constraint pk_qmsresssummt0 primary key (yyyymm,branch_no,vend_id,mtrl_no,chk_no) using index tablespace indx;
Table altered
SQL> create index idx_qms310t0_ymd on qms310t0(yymmdd) tablespace indx;
Index created
再次执行过程
11:43:51 SQL> exec qmsressummt0_test;
PL/SQL procedure successfully completed
11:49:34 SQL>
时间大约为6分钟。
步骤三:合理的改变业务处理方式,亦可提高程序执行效率
对该过程的深入分析可以发现,其中的max最大值,min最小值,和count(*)三个sql语句可以合并成一个sql语句,这样同样可以达到减少sql的执行次数和数据块的io数量,提高效率和降低执行时间的目的。
修改前的sql语句 | 修改后的sql语句
select max(b.item_val) | select max(b.item_val),min(b.item_val),Count(*)
into v_chk_max | into v_chk_max,v_chk_min,v_cnt_01
from qms310t0 a, qms311t0 b | from qms310t0 a, qms311t0 b
where a.check_no = b.check_no | where a.check_no = b.check_no
and a.branch_no = b.branch_no | and a.branch_no = b.branch_no
and a.mtrl_no = r1.mtrl_no | and a.mtrl_no = r1.mtrl_no
and a.vend_id = r1.vend_id | and a.vend_id = r1.vend_id
and a.branch_no = r1.branch_no | and a.branch_no = r1.branch_no
and b.chk_no = r1.chk_no; | and b.chk_no = r1.chk_no;
|
select min(b.item_val) |
into v_chk_min |
from qms310t0 a, qms311t0 b |
where a.check_no = b.check_no |
and a.branch_no = b.branch_no |
and a.mtrl_no = r1.mtrl_no |
and a.vend_id = r1.vend_id |
and a.branch_no = r1.branch_no |
and b.chk_no = r1.chk_no; |
SELECT count(*) |
INTO v_cnt_01 |
FROM qms311t0 a, qms310t0 b |
WHERE a.branch_no = r1.branch_no |
AND a.mtrl_no = r1.mtrl_no |
AND a.chk_no = r1.chk_no |
and a.check_no = b.check_no |
and a.branch_no = b.branch_no; |
执行的情况:
15:31:13 SQL> exec qmsressummt0_test
PL/SQL procedure successfully completed
15:33:42 SQL>
最终,该过程执行的时间<3分钟。
至此,程序执行效率提高10倍左右,调整优化结束。
分享到:
相关推荐
PL/SQL Developer是一款由Allround Automations公司开发的专门用于Oracle数据库管理的集成开发环境(IDE)。这款软件为Oracle数据库管理员、开发人员和测试人员提供了便捷的SQL和PL/SQL编写、调试和执行功能。而“pl...
它允许用户编写、编辑、运行和调试PL/SQL存储过程、函数、触发器、包和类型。语法高亮、自动完成和错误检查等功能帮助开发者快速编写高质量的代码。 2. **数据库对象管理**:该工具提供了直观的界面来浏览和管理...
PL/SQL是Oracle数据库系统中的过程化语言,它结合了SQL查询语句和传统的编程语言元素,用于在Oracle环境中编写存储过程、函数、触发器等数据库应用程序。"PL/SQL汉化工具"指的是专为解决PL/SQL开发环境或者相关软件...
它为用户提供了全面的功能集,包括编写、调试和优化存储在Oracle数据库中的PL/SQL代码的能力。通过使用PL/SQL Developer,开发者可以更高效地管理他们的Oracle数据库应用程序。 ### 注册码的重要性 注册码(或...
所有的pl/sql都叫过程 创建存储过程: create or replace procedure p1 (v1 int ,v2 int)--存储过程的参数列表 as --声明局部变量 begin null; end; 调用过程 1.declare调用 2.命令调用 删除存储过程:drop ...
这些例子展示了PL-SQL存储过程的强大功能,包括变量的声明和初始化、控制流程(如`WHILE`循环和`IF`条件)、游标的使用以及参数传递。在实际应用中,存储过程能够帮助开发者封装复杂的业务逻辑,提高代码的复用性和...
Oracle数据库实用教程第三章主要讲解了PL/SQL程序设计,这是一种强大的数据库编程语言,用于在Oracle环境中编写存储过程、函数和触发器等。PL/SQL结合了SQL的查询能力与面向过程的编程特性,提供了更高效的数据处理...
PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,主要用于编写、调试、测试和管理PL/SQL代码。v7.1.5.1400是该软件的一个版本,它提供了对Oracle数据库的强大支持,包括数据库...
PL/SQL(Procedural Language for SQL)是Oracle数据库的标准编程语言,它允许用户在数据库环境中编写过程化的SQL代码。通过结合SQL的数据操作能力与传统过程化语言的控制结构,PL/SQL能够实现复杂的数据处理任务,...
PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...
Oracle 11G 是一款广泛使用的商业关系型数据库管理系统,其安装过程包括多个步骤,这里将详细介绍整个流程,包括JDK的安装、Oracle的安装、Oracle数据库的创建以及PL/SQL Developer的安装。 首先,JDK(Java ...
SQL主要负责数据的查询、插入、更新和删除等基本操作,而PL/SQL则是一种过程化编程语言,可以编写复杂的业务逻辑和数据库操作。 数据操作语言DML包括了Insert、Update和Delete,它们是SQL中的基本命令,用于对...
在Oracle的Web服务器环境下,PL/SQL过程可以通过HTP和HTF包生成HTML输出,并且还有OWA-UTIL等实用程序包来提供额外功能,如优化锁策略、正则表达式匹配、文本处理、图像操纵以及cookie管理等。 在实际应用中,PL/...
此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。 由于需要返回查询出来的结果集,...
在实际应用中,可能需要考虑优化,比如一次性处理更大块的数据,或者使用更高效的字符串处理技术,如正则表达式(尽管PL/SQL的正则表达式支持不如Java强大)。 总之,PL/SQL实现的`split()`方法虽然不像Java那样...
外部过程是一种服务器端的程序,它允许用户用编程语言(例如C语言)编写例程,然后通过PL/SQL调用这些例程。这种机制对于处理大量数据和执行复杂计算具有重要意义,因为它可以将处理负担从客户端转移到服务器端。 ...
Oracle PL/SQL是一种用于Oracle数据库的结构化查询语言扩展,它结合了SQL的查询能力与过程式编程语言的功能,使得开发者能够编写复杂的数据库应用程序。本文将通过一个入门案例,帮助初学者理解和实践PL/SQL的基本...
PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个集成开发环境,主要用于编写和管理Oracle数据库的存储过程、函数、包、触发器等对象。它是SQL的扩展,增加了程序化组件,使得...