收到监控告警日志文件(Alert)的作业发出的告警邮件,表空间TEMPSCM2不能扩展临时段,说明临时表空间已经被用完了,TEMPSCM2表空间不够用了

Dear All:
 
  The Instance SCM2' alert log occured the ora errors ,please see the detail blow and take action for it. many thanks!

------------------------------------------- The errors is blow ------------------------------------------------------

193 |  | ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMPSCM2 
198 |  | ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMPSCM2 
200 |  | ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMPSCM2 
205 |  | ORA-1652: unable to extend temp segment by 128 in tablespace                 TEMPSCM2

--------------------------------------------end of errors-----------------------------------------------------------

Oracle Alert Services

同事在分析处理时,定位到临时表空间是被一个问题SQL语句给耗尽了。

SELECT B.TABLESPACE, B.SEGFILE#, B.SEGBLK#, B.BLOCKS, A.SID, A.SERIAL#, A.USERNAME, A.OSUSER, A.STATUS

FROM v$session A, v$tempseg_usage B, v$sqlarea C

WHERE A.saddr = B.session_addr

AND C.address= A.sql_address

AND C.hash_value = A.sql_hash_value

ORDER BY B.tablespace, B.blocks;

WORKLOAD REPOSITORY SQL Report显示,单个该SQL的HASH GROUP BY操作就要耗用临时表空间229M,他给的建议是不扩展TEMPSCM2表空间,而是去优化这个SQL语句,因为大部分时候,该数据库的临时表空间使用率是非常低。我也同意他的分析结果。

从该SQL语句的执行计划,就能看出这个SQL语句有问题,例如SC_LOT、PO_HD全表扫描只是为了获取一小部分数据。

SELECT 'CEG'             AS FTY_CD, 

       2015              AS PD_Year, 

       2                 AS PD_Month, 

       a.po_no, 

       SUM(a.total_qty)  AS Order_Qty, 

       SUM(c.total_qty)  GO_QTY, 

       b.buyer_po_del_date, 

       b.status, 

       c.sam_group_cd, 

       c.style_chn_desc, 

       Max(e.short_name) AS CUSTOMER 

FROM   sc_lot a, 

       po_hd b, 

       sc_hd c, 

       gen_customer e, 

       (SELECT ct_no AS Job_order_no 

        FROM   mars_upload_temp 

        WHERE  fty_cd = 'CEG' 

               AND pd_yr = 2015 

               AND pd_mth = 2 

               AND date_type = '20150529 10:00:23881698737881698737') d 

WHERE  Upper(a.po_no) = Upper(b.po_no) 

       AND b.sc_no = c.sc_no 

       AND Upper(a.po_no) = Upper(d.job_order_no) 

       AND c.customer_cd = e.customer_cd(+) 

GROUP  BY b.buyer_po_del_date, 

          b.status, 

          c.sam_group_cd, 

          c.style_chn_desc, 

          a.sc_no, 

          a.po_no

了解了该语句的业务逻辑并和开发人员沟通后,发现WHERE语句的条件Upper函数根本没有必要,取消Upper函数后PO_HD、GEN_CUSTOMER表走索引扫描了

SELECT 'CEG'             AS FTY_CD, 

       2015              AS PD_Year, 

       2                 AS PD_Month, 

       a.po_no, 

       SUM(a.total_qty)  AS Order_Qty, 

       SUM(c.total_qty)  GO_QTY, 

       b.buyer_po_del_date, 

       b.status, 

       c.sam_group_cd, 

       c.style_chn_desc, 

       Max(e.short_name) AS CUSTOMER 

FROM   sc_lot a, 

       po_hd b, 

       sc_hd c, 

       gen_customer e, 

       (SELECT ct_no AS Job_order_no 

        FROM   mars_upload_temp 

        WHERE  fty_cd = 'CEG' 

               AND pd_yr = 2015 

               AND pd_mth = 2 

               AND date_type = '20150529 10:00:23881698737881698737') d 

WHERE  a.po_no= b.po_no

       AND b.sc_no = c.sc_no 

       AND a.po_no= d.job_order_no 

       AND c.customer_cd = e.customer_cd(+) 

GROUP  BY b.buyer_po_del_date, 

          b.status, 

          c.sam_group_cd, 

          c.style_chn_desc, 

          a.sc_no, 

          a.po_no

但是SC_LOT表还是走全表扫描,经过分析发现SC_LOT表的PO_NO列的区分度非常大,应该可以通过建立索引优化。如下所示,建立索引后,SC_LOT不走全表扫描了。

执行计划的代价(Cost)也从7014降为了254. 优化的效果非常显著(Cardinality变得非常大,是因为表MARS_UPLOAD_TEMP数据在我测试阶段发生了变化)

ORACLE SQL调优案例一则的更多相关文章

  1. Oracle SQL 调优健康检查脚本

    Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性 ...

  2. Oracle SQL调优记录

    目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太 ...

  3. Oracle SQL调优之分区表

    目录 一.分区表简介 二.分区表优势 三.分区表分类 3.1 范围分区 3.2 列表分区 3.3 散列分区 3.4 组合分区 四.分区相关操作 五.分区相关查询 附录:分区表索引失效的操作 一.分区表 ...

  4. Oracle SQL调优系列之SQL Monitor Report

    @ 目录 1.SQL Monitor简介 2.捕捉sql的前提 3.SQL Monitor 参数设置 4.SQL Monitor Report 4.1.SQL_ID获取 4.2.Text文本格式 4. ...

  5. Oracle SQL调优之表设计

    在看<收获,不止sql优化>一书,并做了笔记,本博客介绍一下一些和调优相关的表比如分区表.临时表.索引组织表.簇表以及表压缩技术 分区表使用与查询频繁而更新数据不频繁的情况,不过要记得加全 ...

  6. Oracle SQL 调优之 sqlhc

    SQL 执行慢,如何 快速准确的优化. sqlhc 就是其中最好工具之一 通过获得sql所有的执行计划,列出实际的性能的瓶颈点,列出 sql 所在的表上的行数,每一列的数据和分布,现有的索引,sql ...

  7. Oracle 性能调优案例(代码级别)

    业务案例一: 业务:千万记录表中查询出50条符合条件的记录. 现象:oracle部署时跨机器,业务取得数据耗时10ms.造成业务性能不达标. 为了突出主题,对于异常分支,均已省略. 对于通常写法, o ...

  8. Oracle SQL调优之绑定变量用法简介

    目录 一.SQL执行过程简介 二.绑定变量典型用法 2.1.在SQL中绑定变量 2.2.在PL/SQL中使用绑定变量 2.3.PL/SQL批量绑定变量 2.4.Java代码里使用绑定变量 最近在看&l ...

  9. Oracle SQL调优

    在多数情况下,Oracle使用索引t来更快地遍历表,优化器主要根据定义的索引来提高性能. 但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种 ...

随机推荐

  1. C#编程总结(九)字符编码

    C#编程总结(九)字符编码 相信大家一定遇到过乱码的问题,为什么会乱码呢?输出的数据怎么就跟输入的不一样呢? 最近在总结加密问题,也遇到了同样的困扰.所以今天来集中解决这个问题. 什么是字符? 字符是 ...

  2. Debian7编译VIM7.4

    [ 另: vim7.4源码在vs2013的编译方法 ] 1 安装libncurses5库: apt-get install libncurses5-dev 2 安装gvim需要的库: 方法一: apt ...

  3. java中的几种取整函数

    舍掉小数取整:Math.floor(2)=2 舍掉小数取整:Math.floor(2.1)=2 舍掉小数取整:Math.floor(2.5)=2 舍掉小数取整:Math.floor(2.9)=2 负数 ...

  4. [教学] Firemonkey 之 StringGrid Header 自订显示

    StringGrid Header 高度设定方法: uses FMX.Header; procedure TForm1.StringGrid1ApplyStyleLookup(Sender: TObj ...

  5. php中的字符串常用函数(五) explode 妙用

    // 示例 2 $data = "foo:*:1023:1000::/home/foo:/bin/sh" ; list( $user , $pass , $uid , $gid , ...

  6. [python拾遗]异常处理

    异常 异常(Exception)是因为程序的例外.违例.出错等情况而在正常控制流以外采取的行为,一般分为如下两个阶段: 1.异常发生:一个错误发生后被打印出来,称为未处理异常,而默认的处理则是自动输出 ...

  7. Verilog学习笔记设计和验证篇(五)...............层次化事件队列

    详细的了解层次化事件队列有助于理解Verilog的阻塞赋值和非阻塞赋值功能.所谓层次化事件队列指的是用于调度仿真时间的不同Verilog事件队列.在IEEE的5.3节中定义了层次化事件队列在逻辑上分为 ...

  8. 网上图书商城3--Book模块

    小技巧一:分页 ①PageBean<Book> findByCriteria(List<Expression> exprList, int pc)  --- 通用的查询方法(p ...

  9. 设计模式之 面向对象的养猪厂的故事,C#演示(二)

    (三) 优先使用聚合,而不是继承 有一段时间,养猪场的老板雇用了清洁工人来打扫猪舍.但有一天,老板忽然对自己说"不对啊,既然我有机器人,为什么还要雇人来做这件事情?应该让机器人来打扫宿舍!& ...

  10. sql server 数据误删找回

    /****** Object: StoredProcedure [dbo].[Recover_Deleted_Data_Proc] Script Date: 04/23/2014 22:11:59 * ...