ORACLE SQL调优案例一则

收到监控告警日志文件(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数据在我测试阶段发生了变化)

时间: 2024-10-10 14:49:29

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

Oracle SQL 调优健康检查脚本

Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性能问题的有力保证. 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前我们通常的做法,是通过AWR报告或者调试手段,发现某某SQL有问题,之后从Librar

Oracle SQL调优记录

目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太多表.面对复杂的业务场景,确实有些情况是需要关联很多表的.当然有些情况是可以将业务实现放在Java代码里,有些情况可以不要关联很多表. 二.注意点 对于SQL调优,不要马上就说加索引什么的,加索引不一定就能解决问题的,加错索引,反而会导致查询变慢,注意加索引的同时也会影响数据库写数据的速度. 三.O

oracle sql调优集

************************************************************ 1.新建调优集对象 ************************************************************ ---授权 grant ADMINISTER ANY SQL TUNING SET to scott; ---删除存在的STS BEGIN DBMS_SQLTUNE.DROP_SQLSET( sqlset_name => 'OCPYAN

Oracle SQL 调优之 sqlhc

SQL 执行慢,如何 快速准确的优化. sqlhc 就是其中最好工具之一 通过获得sql所有的执行计划,列出实际的性能的瓶颈点,列出 sql 所在的表上的行数,每一列的数据和分布,现有的索引,sql 的实际执行情况 - 时间, IO, 返回行数. 具体使用 参照 Document 1366133.1 SQL Tuning Health-Check Script (SQLHC) 简单步骤: 从 Oracle 免费下载 从 AWR 获得 sqlid 然后运行 sqlhc, 根据提示输入 sqlid

Oracle SQL调优

在多数情况下,Oracle使用索引t来更快地遍历表,优化器主要根据定义的索引来提高性能. 但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句. 在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句 1. IS NULL 与 IS NOT NULL 不能用null作索引,任何包含null值的列都将不会被包含在索引中. 即使索引有多列这样的情况下,只要这些列中有一列含有n

oracle sql 调优

Select * From Table(dbms_xplan.display_cursor(sql_id => '9s7pt2ay4t3jg')); Declare l_Result_Name Varchar2(30); l_Task_Name   Varchar2(36) := 'Task_Name_9s7pt2ay4t3jg_1'; l_Sqlid       Varchar2(36) := '9s7pt2ay4t3jg'; Begin l_Result_Name := Dbms_Sqltu

Oracle技术沙龙《SQL调优-从手工到工业化》

 无dba 不调优 没有学过oracle能调优吗? 告诉你  YES I DO AWR出来好几年了,有关它的作用真正理解的有多少?ADDM能干啥?试一试就知道了! Oracle 10a 的出现,DBA会失业吗? SQL优化从传统模式进入工业化,你了解得有多少? SQL Tuning Advisor能够做哪些优化? SQL Access Advisor能够做哪些优化? 本次技术沙龙以上内容一锅端,使用真实的案例来一一的演绎SQL调优的乐趣 特邀讲师陈卫星:从2010至今,已经在Oracle总部做过

《高性能SQL调优精要与案例解析》一书谈主流关系库SQL调优(SQL TUNING或SQL优化)核心机制之——索引(index)

继<高性能SQL调优精要与案例解析>一书谈SQL调优(SQL TUNING或SQL优化),我们今天就谈谈各主流关系库中,占据SQL调优技术和工作半壁江山的.最重要的核心机制之一——索引(index).我们知道,<高性能SQL调优精要与案例解析>一书中也再三强调索引对SQL调优的重要性,可是上篇文章中也谈到,只看案例和解决问题的具体方法,而不掌握SQL调优的基础知识,是没有用的,我们必须做到知其然,更要知其所以然,才能做到融会贯通,活学活用,进而将SQL调优技术掌握到炉火纯青的地步.

SQL调优

# 问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优 化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL语句,提高系统的可用性. 在多数情况下,Oracle