`
tylgl
  • 浏览: 56822 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一条SQL让20个CPU都50% Busy

阅读更多
一条SQL让20个CPU都50% Busy

一、概述

GOTOTOP有两年多没有冲锋在技术第一线了,所以这篇文章也只是个没营养的案例而已,有经验的你完全可以跳过:)
硬件:20个CPU×2+128GB MEM×2
软件:AIX5.3+HACMP5.2+Oracle10g RAC
这段时间一直在做压力测试,昨晚客户通知昨天压力测试的结果不理想,今天开会分析结果,希望我们参加,客户的希望对我们就是命令,何况现在项目关键阶段,我高度重视,带工程师准时参加了今天的会议。

二、现象

接下来继续测试现场观察测试情况,监控结果发现一个节点的CPU整体消耗了50%多,可是20个CPU哦,而I/O不足10%,检查Oracle数据库监控结果发现如下现象:

SQL ordered by Elapsed Time
Elapsed Time (s) CPU Time (s) Executions Elap per Exec (s) % Total DB Time SQL Id SQL Text
3,469 105 7,036 0.49 8.63 67vjwqswg2zvy
SELECT formatid, globalid, b…
1,725 485 286,314 0.01 4.29 ddvghnq8kypm4
select SUBSID, REGION, CUSTID,…
1,142 1,052 15,685,884 0.00 2.84 0mbs4b6ujgmrn
select RTFEEID, SUBSID, ACCTID…

SQL ordered by CPU Time
CPU Time (s) Elapsed Time (s) Executions CPU per Exec (s) % Total DB Time SQL Id SQL Text
1,052 1,142 15,685,884 0.00 2.84 0mbs4b6ujgmrn
select RTFEEID, SUBSID, ACCTID…
485 1,725 286,314 0.00 4.29 ddvghnq8kypm4
select SUBSID, REGION, CUSTID,…

SQL ordered by Gets
Buffer Gets Executions Gets per Exec %Total CPU Time (s) Elapsed Time (s) SQL Id SQL Text
46,623,132 15,685,884 2.97 48.53 1052.44 1141.87 0mbs4b6ujgmrn
select RTFEEID, SUBSID, ACCTID…
10,673,101 118,925 89.75 11.11 196.59 200.56 3q32j6tdu8×3f
select VALIDBILLCYC, BILLMODEI…

SQL ordered by Executions
Executions Rows Processed Rows per Exec CPU per Exec (s) Elap per Exec (s) SQL Id SQL Text
15,685,884 0 0.00 0.00 0.00 0mbs4b6ujgmrn
select RTFEEID, SUBSID, ACCTID…
1,504,975 1,386,411 0.92 0.00 0.00 743vt34540cs0
select RTFEEID, SUBSID, ACCTID…

SQL ordered by Parse Calls
Parse Calls Executions % Total Parses SQL Id SQL Text
15,686,218 15,685,884 76.82 0mbs4b6ujgmrn
select RTFEEID, SUBSID, ACCTID…
1,504,983 1,504,975 7.37 743vt34540cs0
select RTFEEID, SUBSID, ACCTID…

三、分析结果

结果表明ID为0mbs4b6ujgmrn的SQL在处理变量解析时可能有问题,原因在于:
1、该SQL执行次数很多,而且解析次数基本和执行次数相同,解析该SQL占据所有SQL解析消耗CPU的76.8%;
2、该SQL读取数据量非常大,占所有SQL数据读的48.5%,但没有数据量返回
3、单独执行该SQL响应很快

下面是完整SQL语句:
select RTFEEID, SUBSID, ACCTID, VALIDBILLCYC, F_ACCTAMT, LASTUPDATETIME, F_LASTUPDATEAMT, DISCMINUTE, STATE from IB_CB_REALTIMEFEE where SUBSID=:1 and STATE=:2 and ACCTID=:3

SQL> select count(*) from IB_CB_REALTIMEFEE;

COUNT(*)
———-
248953



dido
Quote Monday, October 16th, 2006 at 11:43
看的不太清楚,是不是执行次数太多了点?
还有空回技术第一线体验一把?

boypoo1
Quote Monday, October 16th, 2006 at 12:51
既然是压力测试阶段,执行次数或许是要求的
该SQL已经使用了bind var,建议考虑下SESSION_CACHED_CURSORS
oracle documents对这个参数的解释是:
SESSION_CACHED_CURSORS specifies the number of session cursors to cache. Repeated parse calls of the same SQL statement cause the session cursor for that statement to be moved into the session cursor cache. Subsequent parse calls will find the cursor in the cache and do not need to reopen the cursor. Oracle uses a least recently used algorithm to remove entries in the session cursor cache to make room for new entries when needed.
This parameter also constrains the size of the PL/SQL cursor cache which PL/SQL uses to avoid having to reparse as statements are re-executed by a user.
我的建议是先看看这个值目前大小,把它设置为300看看,减少频繁open cursor带来的CPU 消耗

tommy
Quote Monday, October 16th, 2006 at 13:12
to dido:都是别人监控的,我只是看看结果,觉得这是个消耗CPU的典型案例就放上来了,呵呵
boypoo大师给的建议和Oracle一样,NB

wangxin
Quote Thursday, March 8th, 2007 at 00:23
1. 怀疑您截取的SQL语句来自工具(如trace)而非程序代码,原代码恐怕还是使用了literal sql。每秒执行15,685,884/(1052.44+1141.87 )/20=357 exections/second/avg_cpu, 不然我只能说IBM的cpu太慢了。
3. 虽然使用fast soft parse是比soft parse快点,但是空转(没有执行结果的操作)一样大量消耗cpu.
solution:
相信这是个多线程(并发)式的访问,只要控制线程数量,如并发执行该语句的线程(进程)为5个,那cpu资源就大大释放了。
不知道这个应用是什么行业的那类业务系统。
分享到:
评论

相关推荐

    解决 MySQL 服务器进程 CPU 占用 100%25的技术笔记.doc

    通过初步排查发现,其中一个特定网站(以下简称“网站 A”)的运行与 CPU 占用率异常升高有关。当停止该网站的服务时,CPU 占用率会显著下降;反之,当恢复网站 A 的服务时,CPU 占用率又会上升至接近 100% 的水平。...

    一条SQL计算扑克牌24点

    一条SQL计算扑克牌24点

    一个完整程序只有一条SQL语句

    现在,让我们深入探讨如何在一个程序中仅使用一条SQL语句实现CRUD操作: 1. **创建(Create)**: 创建新记录通常涉及INSERT INTO语句。一条SQL语句可能包含多个值,通过这种方式一次性插入多行数据。例如: ```sql...

    优化 SQL Server CPU 性能

    在数据系统中,优化 CPU 性能是一个非常重要的方面。了解影响 CPU 利用率的因素、检查硬件性能、使用 PerfMon 跟踪数据库瓶颈、评估查询性能是解决数据库系统性能问题的关键步骤。 影响数据库服务器上的 CPU 利用率...

    SQLSERVER排查CPU占用高的情况

    此脚本将返回 CPU 时间消耗最多的前 10 条 SQL 语句,便于我们针对性地进行优化。 ### 步骤四:检查工作线程 除了以上步骤,还需要关注工作线程的使用情况。使用以下脚本可以查看系统的工作线程数: ```sql SELECT ...

    CPU三核六核3核6核电脑如何安装SQL数据库sql

    虽然这种解决方案可能不是最理想的,但在当前情况下不失为一个可行的方法。对于使用六核CPU的计算机,建议直接使用更新版本的数据库软件,如SQL Server 2012或更高版本,以避免类似的兼容性问题。

    根据以下语句查询执行消耗CPU大的sql语句.docx

    这个语句的优点是可以查询到当前数据库中消耗 CPU 最高的 TOP 50 个语句,并且可以查看每个语句的平均每次 CPU 消耗、最后执行时间、物理读取次数、执行次数等信息。 语句二:根据当前会话查询执行的语句 这个语句...

    SQL查询当前数据上一条和下一条的记录

    SQL查询当前数据上一条和下一条的记录,管用,仅供参考!!!

    SQL_Server_2008_R2_CPU_和_内存_最大优化_分配

    SQL Server 2008 R2 引入了一个重大改进,即资源控制器,这使得管理员能够更有效地管理和优化服务器的CPU及内存分配。相对于之前的版本,如SQL Server 2005,资源控制器提供了一种全新的策略来解决多数据库环境下...

    用一条SQL语句将数据表中某列更新到另一个数据表里

    ### 使用单条SQL语句更新数据表中的某一列至另一表 #### 背景介绍 在数据库管理中,经常需要对数据进行更新操作来确保...对于Oracle 10g及以上版本的数据库系统而言,上述方法提供了一个实用的工具来解决这类问题。

    SQL把一条记录金额平分到n个人并进行汇总.txt

    如果3个字段都有营业员,则金额除三再分配到这三个人,如果有两个字段有营业员,另一个为空,则金额除2再平分到两个人上,如果只有一个则算他,如果都为空,则算到空值里,适用于SQL,VBA,oracle,Access等

    CPU核心数影响SQL Server 2005正常安装的解决方法

    - 在“高级选项”框中勾选“/NUMPROC”选项,并设置一个适当的数值。这个数值应该根据具体情况而定,一般建议设置为不超过16的核心数。 比如,在本例中,由于服务器的实际核心数为24个,可以尝试将`/NUMPROC`的...

    快速定位MSSQL占用CPU高的sql方法

    运行以下查询,该查询将返回过去执行时间中CPU使用量最高的前20个SQL语句的相关信息,包括执行次数、总CPU时间、总耗时等: ```sql SELECT --TOP 20 total_worker_time / 1000 AS [自编译以来执行所用的CPU时间...

    AWR报告分析

    AWR报告,全称Automatic Workload Repository Report,是Oracle数据库中的一个重要工具,用于收集和分析数据库的性能数据。通过对AWR报告的分析,我们可以深入了解数据库的运行状况,尤其是在CPU负载方面的问题。 ...

    access 一次执行多条sql语句

    ### Access一次执行多条SQL语句 在Access数据库管理中,有时我们需要在同一事务中执行多条SQL语句来确保数据的一致性和完整性。例如,在更新某个记录后可能还需要执行其他操作,如增加日志记录等。本文将详细介绍...

    关于6核cpu安装SQL2005报错的解决办法

    2. **创建并执行批处理脚本**:编写一个批处理脚本,其作用是自动化更新并整合SP3补丁至原始安装文件。脚本内容包括: - 复制和更新服务器环境文件。 - 使用MSIExec命令静默安装并应用SP3补丁。 - 更新释放的文件...

    50个常用SQL语句.zip

    50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用SQL语句.zip50个常用...

    50个经典sql语句总结

    50个经典sql语句总结50个经典sql语句总结50个经典sql语句总结50个经典sql语句总结

    查询SQL中哪些语句执行最占用CPU

    查询SQL中哪些语句执行最占用CPU.

Global site tag (gtag.js) - Google Analytics