记录通过执行Oracle的执行计划查询SQL脚本中的效率问题
 
问题现象: STARiBOSS5.8.1R2版本中,河北对帐JOB执行时,无法生成发票对帐文件。
 
首先,Quartz表达式培植的启动时间为2分钟执行一次JOB,通过日志上看,该JOB已经启动。且在开始统计发票信息后就没有新的日志了,因河北广电数据库很大,猜测是统计发票的SQL 效率低。在比较小的库上执行,系统正常生成发票对帐文件,因此确认猜测为正确的。
 
然后,将发票统计的SQL截取出来,其中一个SQL如下:

select n.noteid_pk,
       n.notecodestr,
       n.totalmoneyid,
       n.notestatusid,
       n.createdt,
       n.modifydt,
       n.taxregisrationno,
       n.securitycode,
       pi.printinstanceid_pk,
       o.citycode
  from noteen n, printinstanceen pi, salechannelen s, operareaen o
 where n.salechannelid1 = s.salechannelid_pk
   and s.operareaid_pk = o.operareaid_pk
   and n.noteid_pk = pi.printpaperid(+)
   and n.taxregisrationno is not null
   AND o.citycode = '0667'
   and n.notetypeid in
       (select r.resourcecataid_pk
          from resourcecataen r
         where 1 = 1
           AND (r.resourcecatanamestr = '河北新发票'))
   and trunc(n.createdt) = to_date('2013-05-22', 'yyyy-MM-dd');

在 河北广电数据库中执行该脚本运行时间为170S以上,因此需要优化统计的SQL。优化前,首先需要找到SQL的查询效率低的“瓶颈”,然后再优化SQL
 
使用PL/SQL 从Tools - Explain Plan中可以查看该SQL的执行计划,找出SQL的“瓶颈”在那儿。如图所示 
 

这段SQL的执行计划如下图: 其中Cost 总花费为182682 ,查询PRINTINSTANCEEN 时,Cost花费为180913,且查询时候使用了FULL全表扫描
因此可见,查询品“瓶颈”为关联表PRINTINSTANCEEN ;
SQL中关联时使用了 “  and n.noteid_pk = pi.printpaperid(+)” 因此,查询PRINTINSTANCEEN 表信息,发现PRINTINSTANCEEN 数据量很大,大概有800W数据。
关联查询PRINTINSTANCEEN 表时,进行了全表扫描,表数据又很大,因此效率低,为提高效率,为printpaperid添加索引。
 
 

再次从Tools - Explain Plan中可以查看该SQL的执行计划。发现查循关联PRINTINSTANCEEN 时已经不是FULL全表扫描,
而是使用了INDEXRANGESCAN(索引IDX$PRINTPAPERID) 查询COST 已经下降到7, 从数据库中运行脚本查询速度为0.025。
 
 
 
备注:
cost只是指导值,Oracle优化器通过对象的统计信息来计算相关计划的成本cost,并通过cost的高低来衡量有限的几种可用计划。
但cost高并不代表计划就不好,cost低也不代表计划好;它只是一种指导优化器的依据。
 
 

【ORACLE】记录通过执行Oracle的执行计划查询SQL脚本中的效率问题的更多相关文章

  1. shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    7月11日任务 20.1 shell脚本介绍20.2 shell脚本结构和执行20.3 date命令用法20.4 shell脚本中的变量 20.1 shell脚本介绍 1.shell脚本语言是linu ...

  2. Linux centosVMware shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    一. shell脚本介绍 shell是一种脚本语言 aming_linux blog.lishiming.net 可以使用逻辑判断.循环等语法 可以自定义函数 shell是系统命令的集合 shell脚 ...

  3. showplan_text查询计划查询 sql执行顺序 时间 IO

    http://www.cnblogs.com/happyday56/archive/2009/09/10/1564144.html   set showplan_text ongoselect exp ...

  4. Oracle入门第二天(上)——基本查询SQL

    一.SQL概述 起源于标准不再赘述,主要分为DDL,DML,DCL 相关介绍,参考MySQL章节:http://www.cnblogs.com/jiangbei/p/6696202.html 二.基本 ...

  5. 如何执行超过一百兆(100MB)的sql脚本?

    最近遇到一个问题,在sqlserver的查询分析器里面执行一个超过100MB的数据库脚本,发现老是报“引发类型为“System.OutOfMemoryException”的异常”,上网查了一下,主要是 ...

  6. Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql

    select fu.user_name 用户名,         fu.description 描述,              (select ppf.FULL_NAME              ...

  7. 【Oracle】曾经的Oracle学习笔记(1-3) 数据库常见用语,常见命令,创建测试表

    一.数据库的登录 二.数据库常用语 三.测试表的创建,测试数据初始化 四.常见命令介绍 五.测试 user:jeffreysn:jeffrey user:systemsn:jeffrey 浏览器中输入 ...

  8. Jenkins系列之-—08 实现SQL脚本批量执行

    公司内部推广DevOps,所有目前在维护阶段和开发阶段项目全部配置上了自动发布.采用Jenkins+SVN+ANT,之后批量执行SQL语句的实现提上日程 一.环境 Linux环境 安装ANT工具,且下 ...

  9. mysql数据库,如何在登录mysql之后执行操作系统上的SQL脚本?

    需求描述: 通过mysql客户端登录到mysql数据库,如何执行操作系统上的SQL脚本文件呢? 操作过程: 1.编写测试脚本文件 [mysql@redhat6 scripts]$ cat SeCoun ...

随机推荐

  1. [LeetCode] Implement strStr()

    Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...

  2. 面试题之【打印1到最大的N位数】

    题目描述:给定一个数字N,打印从1到最大的N位数. 看起来像是很简单的问题(虽然实际也不是很难...)我们很容易写出这样的代码: #include<iostream> #include&l ...

  3. hdu 2232 矩阵 ***

    一天四个不同的机器人a.b.c和d在一张跳舞毯上跳舞,这是一张特殊的跳舞毯,他由4个正方形毯子组成一个大的正方形毯子,一开始四个机器人分别站在4 块毯子上,舞蹈的每一步机器人可以往临近(两个毯子拥有同 ...

  4. [Eclipse][SVN] 在eclipse上安装SVN

    以前装过好多次SVN,始终没有一次把安装过程记录下来,这次新装机器,安装SVN插件时一波三折,记录下来免得以后又忘记了.   方法一: 1. 直接通过后台添加URL通过互联网进行安装,直接上图: 2. ...

  5. Linux命令之ar - 创建静态库.a文件和动态库.so

    转自:http://blog.csdn.net/eastonwoo/article/details/8241693 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中 ...

  6. Cygwin的安装,卸载,以及安装gdb

    转载来源 http://10000001.blog.51cto.com/4600383/1341484   1.安装 其实Cygwin的安装时很简单的,需要的安装相应的就可以了,要详细的去网上找,很多 ...

  7. java学习笔记(3):网络编程

    基本原理 客户端要发起通信,首先得知道运行服务器程序主机的IP地址,然后由网络的基础结构利用目标地址,将发送的信息传递到正确的主机上.地址可以是数字型(IPv4或者IPv6),也可以是字符串(必须先被 ...

  8. 为什么要使用 Node.js

    这是一个移动端工程师涉足前端和后端开发的学习笔记,如有错误或理解不到位的地方,万望指正. Node.js 是什么 传统意义上的 JavaScript 运行在浏览器上,这是因为浏览器内核实际上分为两个部 ...

  9. 【T_SQL】 基础 事务

    1.使用 T-SQL 语句来管理事务       开始事务:BEGIN TRANSACTION       提交事务:COMMIT TRANSACTION       回滚(撤销)事务:ROLLBAC ...

  10. 词法分析 after Coding

    学习词法分析,认为词法分析很难. 虽然不懂,但是要完成作业. 去图书馆或者看书借鉴代码,修改错误,让代码正常运行. 学习词法分析后,了解到自己有很多的不足: 1.代码不是很熟练,课本知识不了解.知识面 ...