zoukankan      html  css  js  c++  java
  • 抓取oracle数据库耗费资源的sql语句

     oracle数据库连接业务系统,而有些sql语句的执行严重影响了oracle的性能,就如同mysql的慢查询一样,mysql可以开启慢查询日志定位这些造成数据库性能下降的语句,而oracle同样可以做到,而且有过之而无不及。

        下面举例说明

        首先用root用户登陆核心应用系统,su - oracle

        执行命令 topas

        可以查看到如下信息:

    解释三个地方

    1.Idle%:是cpu的空闲率

    2.PID:进程唯一标示符

    3.CPU%:该进程所占用的cpu的百分比

        从上述信息可以定位进程为1454604的进程占用资源比较高,查询该进程的sql语句情况。

        登陆核心系统oracle数据库,执行以下语句

    1. select c.spid,a.p1,a.p1raw,a.p2,a.event,b.sql_text,b.SQL_FULLTEXT,b.SQL_ID 
    2. from v$session a,v$sql b,v$process c 
    3. where a.wait_class<>'Idle' and a.sql_id=b.sql_id and a.PADDR=c.addr 
    4. order by event;

    情况如下图所示:

        找到对应的SPID,点击SQL_FULLTEXT列下的CLOB后面的按钮,可以查看耗费系统资源的具体sql语句。

    1. select 'X'  
    2. from lctcont  
    3. where '1344926626000'='1344926626000'  
    4. and  certifycode like 'TTS%'  
    5. and grpcontno  
    6.   in ( select c.grpcontno from ljaget a ,ljagetendorse b ,lcgrpcont c 
    7.            where a.EnterAccDate is null  
    8. and a.actugetno = b.actugetno  
    9. and b.grpcontno = c.grpcontno 
    10. and a.otherno='8053000000139568' 

        找到了根源,接着就是如何解决,可见由于字段grpcontno上没有索引,导致表lctcont的全表扫描,最终造成整个执行计划的错乱(其中有笛卡尔积)。因此,正确的再字段grpcontno上创建索引,即可解决此问题。由于这是开发人员写的sql语句,所以对于sql语句的优化,要由他们来配合操作,作为dba不但要懂得如何在内存体系结构上优化数据库,更要懂得协同开发人员一起进行oracle数据库的优化。

    本文出自 “我就是我非此非彼” 博客,请务必保留此出处http://wukui127.blog.51cto.com/2866802/963370

  • 相关阅读:
    好的学习资源
    对paper有用的idea
    斜杠青年
    简书随笔
    点云专业英文单词
    通过 UDP 发送数据的简单范例
    简单的聊天时范例(客户端)
    键盘输入
    简单的传输文件范例
    编写serversocket简单示例1
  • 原文地址:https://www.cnblogs.com/likeju/p/5039838.html
Copyright © 2011-2022 走看看