快速定位隐蔽的sql性能问题及调优

在前几天,有个开发同事问我一个问题,其实也算是技术救援,他说在有个job数据处理的频率比较高,在测试环境中很难定位出在哪有问题,而且速度也还能接受,但是在生产环境中总是会慢一些,希望我能在测试环境中协助他们,看看是不是sql语句出什么问题了还是其它相关的问题。
这种类似实时监控的语句,从第一印象来说,很可能通过awr捕获不到,如果通过ash来捕获,因为测试环境中有几十套测试环境在运行,就算得到某个时间点的一些sql语句,直接在报告中映射到语句对应的schema信息还是有一些困难的。因为测试时间确实很短,有很多的语句执行了,可能不一定被ash收集到。
我和他首先做了沟通,因为我压根不知道这是哪个应用的环境,所以先需要几分钟的时间来熟悉一下环境,提前准备一下。
数据库中存在大概50套测试环境,占用的session数大概在4000个左右。整体来看测试环境中的数据量都不大。每个环境都大概在10G-30G以内。
定位到制定的测试环境中,发现session占用情况也不高。都是一些常规的job使用,没有看到其它明显的session消耗,查看相关的锁信息,也没有发现什么问题。
简单确认之后,发现awr在这个时候是用不了了,最多使用下ash来看,除此之外,还可以使用脚本实时监控。
类似下面这样的操作。
> getash.sh
I    SID   SER# USERNAME     OSUSER     STA RPID    SPID   MACHINE    PROGRAM              ELAP_SEC    TEMP_MB UNDO_MB SQL_ID        TSPS   SQL
-- ------ ------ ------------ ---------- --- ------- ------ ---------- -------------------- ----------- ------- ------- ------------- ------ -------------------------------------------------
 1     19  16945 xxxx    blwrk01   ACT 9442    9442   ccbdbprx   oracle@xxxxxx  00 05:35:02                 b9xg175fbzuk5        INSERT INTO xxxx (CYCLE_SEQ_NO, PAY

上面的语句也可以通过watch来指定频率看到每个用户下的信息实时变化情况。监控的过程中确实也能看到不少的信息变化,但是执行的时间确实很短,只能够抓取到一部分sql语句。简单分析了下,那些语句都没有发现有什么问题。
这个时候还是得靠开发协助,希望他们提示一些更细节的信息,这个业务场景要做的事情和一些指定的数据,他们提供说使用了某个表中资源号为 x271051128的数据,这个时候通过v$sql从缓存中就能够快速定位到语句,这个时候再和ash配合起来就能够确认是否是相关的用户在调用了。
最后抓取到了几条语句,和开发确认之后定位到一条语句,语句类似下面这样的形式。

select
owner_id,

      
l3_balance_amount,

      
expiration_date,

      
customer_id,

      
c64_1,

      
l3_balance_Status,

      
sys_update_date,

      
sys_creation_Date

 
from accumulators

where
customer_id in

      
(select customer_id

         
from subscriber

        
where prim_Resource_Val in ('x271051128'))

  
and owner_type = 'P'
通过抓取执行计划,发现subscriber表走了全表扫描。这个对应生产环境中的性能影响还是比较大的。


对于这个问题的调优,其实可以完全通过业务层面来优化,可以参考http://blog.itpub.net/23718752/viewspace-1312163/
问题是类似的,略有不同。我们可以引入一个更大的资源表,资源表agreement_resource和用户表subscriber,使用索引字段来关联,就避免了subscriber表的全表扫描。
调整后的语句如下:

select
owner_id,

      
l3_balance_amount,

      
expiration_date,

      
customer_id,

      
c64_1,

      
l3_balance_Status,

      
sys_update_date,

      
sys_creation_Date

 
from ape1_accumulators

where
customer_id in

      
(

      
select customer_id

  from subscriber s

where (subscriber_no, PRIM_RESOURCE_TP)
in

      
(select agreement_no, RESOURCE_TYPE

         
from agreement_resource r

  
      where r.resource_value in ('x271051128'))

      
)

  
and owner_type = 'P'
通过调整后的执行计划可以看出,性能的提升还是很大的。这个是测试环境的数据,如果在数据量大的时候,优势就更加明显了。

所以对于这个问题,起因是有个job数据处理的频率比较高,在测试环境中很难定位出在哪有问题,而且速度也还能接受,但是在生产环境中总是会慢一些,其实深究起来还是有原因的,只能通过各种细节去诊断发现了。

时间: 2024-10-22 11:12:49

快速定位隐蔽的sql性能问题及调优的相关文章

性能测试知多少---性能分析与调优的原理

最近一直纠结性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库.从操作系统(CPU调度,内存管理,进程调度,磁盘I/O).网络.协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配置等方面入手. 单一个中间件又分web中间件(apache .IIS),应用中间件(tomcat .weblogic .webSphere )等,虽然都是中间件,每一样拎出来往深了学都不是一朝一夕之功.但调优对于每一项的要求又不仅仅是"知道"或"会使用"这么

对话马丁·福勒(Martin Fowler)——第六部分:性能与过程调优

第一部分:重构第二部分:设计原则与代码所有权第三部分:进化型设计第四部分:灵活性与复杂性第五部分:测试驱动开发第六部分:性能与过程调优 可维护性与效率 比尔:我在丹佛机场的红地毯俱乐部(Red Carpet Club)[1]中常常碰到名人.今年夏天我碰到了 Calista Flockhart (卡莉斯塔·弗洛克哈特)[2], 而去年我碰到了你.我是个追星族,但是由于害怕哈里森·福特,没敢跟 Calista 搭讪.不过,你和我倒是坐下来喝了杯啤酒.记得当时你曾对我说过,应该以程序员能读懂的字符格式

一条sql语句的建议调优分析

前几天开发的同事问我一个sql的问题,目前在测试环境中发现这条sql语句执行时间很长,希望我们能够给一些建议,能够尽快做一些改进.sql语句类似下面的形式.SELECT /*+ INDEX(ACCOUNT,ACCOUNT_PK)INDEX(ACCOUNT_EXT ACCOUNT_EXT_PK) */ ACCOUNT.ACCOUNT_ID, ACCOUNT.BE, ACCOUNT.CUSTOMER_NO, ACCOUNT.AR_BALANCE, ACCOUNT_EXT.CYCLE_CODE, AC

Hadoop虚拟化的性能对比和调优经验

虚拟化为Hadoop注入了前所未有的活力,从IT生产管理的角度,表现为以下几点: ·Hadoop和其他消耗不同类型资源的应用一起部署共享数据中心可以提高总体资源利用率: ·灵活的虚拟机操作使得用户可以动态的根据数据中心资源创建.扩展自己的Hadoop集群,也可以缩小当前集群.释放资源支持其他应用如果需要: ·通过与虚拟化架构提供的HA.FT集成,避免了传统Hadoop集群中的单点失败,再加之Hadoop本身的数据可靠性,为企业大数据应用提供了可靠保证. 基于这些原因,vSphere Big Da

mysql 性能的检查和调优方法_Mysql

在遇到严重性能问题时,一般都有这么几种可能:1.索引没有建好; 2.sql写法过于复杂; 3.配置错误; 4.机器实在负荷不了; 1.索引没有建好 如果看到mysql消耗的cpu很大,可以用mysql的client工具来检查. 在linux下执行 /usr/local/mysql/bin/mysql -hlocalhost -uroot -p 输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中. 看看当前的运行情况 show full processlist 可以多运行几次 这个命令可

mysql性能的检查和调优方法

我一直是使用mysql这个数据库软件,它工作比较稳定,效率也很高.在遇到严重性能问题时,一般都有这么几种可能: 1.索引没有建好; 2.sql写法过于复杂; 3.配置错误; 4.机器实在负荷不了; 1.索引没有建好 如果看到mysql消耗的cpu很大,可以用mysql的client工具来检查. 在linux下执行 /usr/local/mysql/bin/mysql -hlocalhost -uroot -p 输入密码,如果没有密码,则不用-p参数就可以进到客户端界面中. 看看当前的运行情况 s

使用TPTP对Eclipse插件进行性能剖析和调优

TPTP 及其各子项目简介 TPTP(Eclipse Test & Performance Tools Platform) 是 Eclipse 基金 会下的一个开源子项目,提供了一组基于 Eclipse 的工具,对软件开发的各个 阶段提供支持.基本已经覆盖了从测试到运行时性能分析.运行状态.日志分析 的全过程.从其项目首页来看,其主要开发者来自包括 IBM 和 Intel 在内的大 公司.更重要的是,由于其开放性,使得基于其上来开发自己的工具变得非常容 易,这样一来就极大地降低了开发 "

DB2 for i5/OS上的SQL性能优化目标评测

简介 DB2 for i5/OS on V5R4 提供了一些新方法来通过一些流行的动态 SQL 接口提高数据库查询的性能.SQL Call Level Interface (CLI) 为用户提供了一个新的连接属性,用于调优数据库查询使用的优化目标.用于 IBM Developer Kit for Java 的 Java Database Connectivity (JDBC) 接口(也称 Native JDBC)和 Toolbox 也提供了一个新的可控制查询优化目标的连接属性.那些熟悉 Syst

Java 程序性能优化《第一章》Java性能调优概述 1.2性能调优的层次

Java 程序性能优化<第一章>1.2性能调优的层次 为了提升系统性能,开发人员开始从系统各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层面都可以通过各种手段进行优化,从而在整体上提升系统的性能. 1.2.1 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之处,软件架构师就应该评估系统可能存在的各种潜在问题,并给出合理的设计方案.由于软件设计和架构对整体质量有决定性的影响,所以,设计调优对系统性能的影响