`
lxf3339
  • 浏览: 60999 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

pl/sql存储过程优化一例

阅读更多

问题提出:

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     

 

Oracle9i10gsql优化器优先采用cbo方式,cbo方式下,oracle优化器可以更智能更合理的选择执行计划,从而使sql的执行效率更高,而若相关tableindex没有统计信息的话,则会转而采用传统的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>                                                 

 

可以试验比对一下,采用rbocbo的执行效率对比情况

10:41:43 SQL> exec qmsressummt0_test;

PL/SQL procedure successfully completed

11:03:37 SQL>

 

可以发现,现在的执行时间在20分钟,在此过程中,效率提高了接近1/3,由此,我们可以看到相同的sql语句,优化器采用cbo比采用rbo效率要提高不少。

 

步骤二:合理利用索引,进一步提高sql执行效率

 

分析proceduretable,相关的表需要建立索引,这一步需要根据以往的经验,建立相关索引(开发人员并没有考虑新增索引,甚至主键都没有),并抽取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快捷插件

    PL/SQL Developer是一款由Allround Automations公司开发的专门用于Oracle数据库管理的集成开发环境(IDE)。这款软件为Oracle数据库管理员、开发人员和测试人员提供了便捷的SQL和PL/SQL编写、调试和执行功能。而“pl...

    【PL/SQL Developer 10.0.5.1710 官方中文版+注册机,亲测通过】

    它允许用户编写、编辑、运行和调试PL/SQL存储过程、函数、触发器、包和类型。语法高亮、自动完成和错误检查等功能帮助开发者快速编写高质量的代码。 2. **数据库对象管理**:该工具提供了直观的界面来浏览和管理...

    PL/SQL汉化工具

    PL/SQL是Oracle数据库系统中的过程化语言,它结合了SQL查询语句和传统的编程语言元素,用于在Oracle环境中编写存储过程、函数、触发器等数据库应用程序。"PL/SQL汉化工具"指的是专为解决PL/SQL开发环境或者相关软件...

    pl/sql 注册码

    它为用户提供了全面的功能集,包括编写、调试和优化存储在Oracle数据库中的PL/SQL代码的能力。通过使用PL/SQL Developer,开发者可以更高效地管理他们的Oracle数据库应用程序。 ### 注册码的重要性 注册码(或...

    PL/SQL学习笔记

    所有的pl/sql都叫过程 创建存储过程: create or replace procedure p1 (v1 int ,v2 int)--存储过程的参数列表 as --声明局部变量 begin null; end; 调用过程 1.declare调用 2.命令调用 删除存储过程:drop ...

    PL-SQL 存储过程

    这些例子展示了PL-SQL存储过程的强大功能,包括变量的声明和初始化、控制流程(如`WHILE`循环和`IF`条件)、游标的使用以及参数传递。在实际应用中,存储过程能够帮助开发者封装复杂的业务逻辑,提高代码的复用性和...

    Oracle数据库实用教程第三章 PL/SQL程序设计.pptx

    Oracle数据库实用教程第三章主要讲解了PL/SQL程序设计,这是一种强大的数据库编程语言,用于在Oracle环境中编写存储过程、函数和触发器等。PL/SQL结合了SQL的查询能力与面向过程的编程特性,提供了更高效的数据处理...

    pl/sql developer v7.1.5.1400 注册文件(Keygen)

    PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,主要用于编写、调试、测试和管理PL/SQL代码。v7.1.5.1400是该软件的一个版本,它提供了对Oracle数据库的强大支持,包括数据库...

    PL/SQL 报表的开发流程及html 格式的输出方法

    PL/SQL(Procedural Language for SQL)是Oracle数据库的标准编程语言,它允许用户在数据库环境中编写过程化的SQL代码。通过结合SQL的数据操作能力与传统过程化语言的控制结构,PL/SQL能够实现复杂的数据处理任务,...

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    Oracle11G安装教程,pl/sql压缩版使用

    Oracle 11G 是一款广泛使用的商业关系型数据库管理系统,其安装过程包括多个步骤,这里将详细介绍整个流程,包括JDK的安装、Oracle的安装、Oracle数据库的创建以及PL/SQL Developer的安装。 首先,JDK(Java ...

    Oracle10g中的sql和pl\sql

    SQL主要负责数据的查询、插入、更新和删除等基本操作,而PL/SQL则是一种过程化编程语言,可以编写复杂的业务逻辑和数据库操作。 数据操作语言DML包括了Insert、Update和Delete,它们是SQL中的基本命令,用于对...

    PL_SQL的Web应用浅谈.pdf

    在Oracle的Web服务器环境下,PL/SQL过程可以通过HTP和HTF包生成HTML输出,并且还有OWA-UTIL等实用程序包来提供额外功能,如优化锁策略、正则表达式匹配、文本处理、图像操纵以及cookie管理等。 在实际应用中,PL/...

    PL/SQL中编写Oracle数据库分页的存储过程

    此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。 由于需要返回查询出来的结果集,...

    PL/SQL实现JAVA中的split()方法的例子

    在实际应用中,可能需要考虑优化,比如一次性处理更大块的数据,或者使用更高效的字符串处理技术,如正则表达式(尽管PL/SQL的正则表达式支持不如Java强大)。 总之,PL/SQL实现的`split()`方法虽然不像Java那样...

    Oracle8i PL_SQL外部过程在海量数据处理中的应用.pdf

    外部过程是一种服务器端的程序,它允许用户用编程语言(例如C语言)编写例程,然后通过PL/SQL调用这些例程。这种机制对于处理大量数据和执行复杂计算具有重要意义,因为它可以将处理负担从客户端转移到服务器端。 ...

    Oracle PL/SQL入门案例实践

    Oracle PL/SQL是一种用于Oracle数据库的结构化查询语言扩展,它结合了SQL的查询能力与过程式编程语言的功能,使得开发者能够编写复杂的数据库应用程序。本文将通过一个入门案例,帮助初学者理解和实践PL/SQL的基本...

    plsql安装程序plsql.rar

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一个集成开发环境,主要用于编写和管理Oracle数据库的存储过程、函数、包、触发器等对象。它是SQL的扩展,增加了程序化组件,使得...

Global site tag (gtag.js) - Google Analytics