February 2010
M T W T F S S
« Jan    
1234567
891011121314
15161718192021
22232425262728

利用SQL Monitor Report对SQL进行诊断与调优

Kaya 发表于 os2ora.com 

本文要分析的是下面这个SQL,执行了半个多钟头还没返回结果。

INSERT /*+ APPEND */
INTO
 T_D
SELECT
 *
FROM
 T_A a
,T_B b
,T_C c
WHERE a.id = b.id
AND   b.number = c.number
;

 

Wait events 是了解Oracle运行状态的一个重要途径。对于某个具体的SQL,SQL Monitor Report提供了drill down的方式得到这个具体SQL在运行中的wait events的分布情况,下面是SQL Monitor Report的相应图形。

image

这里最突出的等待事件是enq: TS – contention,这是关于临时segment的等待事件,这可能是一般的表空间的争用(例如并行直接路径加载数据),也可能是临时表空间的争用(例如为了hash join或者sort)。那么这时临时表空间的增长状态是怎么样子的呢?SQL Monitor Report提供了这方面的信息。

image

可以看出,temp space从开始的3G慢慢增长到20G,整个过程2800 seconds,如果算下速度的话17GB/2800=6MB/s。这刚好与上面的等待事件 enq: TS – contention相吻合。

这是一个直接加载数据的例子,在这个例子中,最后表的大小是30GB左右。可以怀疑,这些临时表空间的分配是为了存放最后放入目标表的数据。

这于这个等待事件enq: TS – contention发生在这个SQL执行过程中的哪一步呢?SQL Monitor Report也给出了答案,在执行计划那一页:

image

注意上图鼠标位置,标志着位于HASH JOIN BUFFERED这个步骤的等待事件enq: TS – contention占了这个SQL所有等待活动的97%!

问题到这里已经基本明了了:

1. 优化器采用Hash Join Buffered的方式返回三个表Join的结果,当为这些结果集分配临时表的空间时,碰到了严重的竞争。

2. 由于分配速度极其缓慢,导致了整个SQL超过97%的时间花在了这个等待事件上,通过去掉这个等待事件,这个SQL应该能提升上百倍的速度。

解决这个问题的根本在于加速临时表空间的回收速度,不过,也有workaround的办法,那就是预先分配足够的临时表空间,避免回收临时表空间时出现TS – contention竞争。

另外一种思路,则在于减少对临时表空间的利用,在这里,为什么要用到这么多临时表空间在于Oracle采用Hash Join Buffered而不是采用Hash Join,这意味着Oracle会先对Join的结果集进行buffer,等到所有结果ready之后再写到目标表,另一种思路当然是让结果直接写到目标表中,也就是实现并行的DML插入操作。方法很简单:在运行这个SQL之前加上

ALTER session enable parallel dml;

即可,在这种情形下,Oracle不需要再为结果集分配临时表空间,同时,由于采用并于DML操作,整个SQL的运行时间会得到很大的提速。下面是相应的执行计划。

image

可以看出,Hash Join Buffered变成了Hash Join,同时,等待事件enq: TS contention已然消失,换成了”喜闻乐见”的ON CPU。同时,整个SQL在小于30s的时间内完成了。

不可否认,Hash Join Buffered是这里极其隐蔽,可能不小心就被忽略了,以为上面两个执行计划就是LOAD AS SELECT的位置从第2行搬到了第4行,其实背后发生的事情远没有这么简单。以后有机会再对这个话题进行展开吧。

11gR2出色的SQL Monitor Report

SQL Monitor Report是11g推出的一个新特性。如果说11gR1里的SQL Monitor Report已经达到可圈可点的程度,那么11gR2里的SQL Monitor Report可以说已经接近完美了。

这个SQL Monitor Report包含的信息比单纯的Execution Plan可全面多了,基本上,有了这份报告之后,troubleshooting所需要的大部分信息都已经具备了。

这个Report主要包括以下五部分……

2010展望

近来越来越觉得自己有种回归过去的感觉。
os2ora在2007年底开始想这个名字时其实是这样解释的: os2分别代表Operating System和Open Source, ora当然是代表Oracle了。后来2009年初自己把os2ora简化为OS与Oracle。不过,现在又开始觉得其实这里的东西有些还是与Open Source密不可分的。
同样的,在2009年初,自己定的目标是专注在OS与Database的性能监控与调优上面。现在又觉得其实这里面很多东西涉及到系统架构,软件设计方面的东西,而关于系统架构与软件设计的理论其实在2006年之前的某种时间就比较系统的了解过了。
也许这也算是自己在软件领域思想认识的一个迭代过程吧,但愿这次回归是去除了浮躁的一种真正的回归。
与回顾相比,其实展望更有其实际意义,起码可以做为一个前进的指引标志。为了证明自己或许更擅长于右脑思维:-),还是以一个思维发散图做下展望吧……

2009回顾

2009年基本上是属于Exadata的一年,随着在中国的第一个大型的Benchmark拉开序幕,这个benchmark基本上涵盖了所有Benchmark可能涵盖的内容。
经验的分享是2009年的另一个主题,当然主要还是关于Exadata,既有和站在市场前线的销售支持团队的分享活动,也有和主要客户的经验交流,每次分享都带来了意想不到的收获,认识了更多志同道合的朋友。同时,一方面开阔了自己的视角,一方面也让自己以后的工作更有针对性。
另一个成绩可能是对os2ora.com的更新,从2009年3月份改版以来,基本上坚持了一周一篇文章的频率,好象与开始自己的预期挺接近的。更重要的是,通过对网站的维护,使自己对web 2.0有了更深一步的体会,同时也让自己成为了google reader的忠实用户(My Google Profile)。对os2ora.com的更新,现在看来,只是属于知识的获取与分享中的一个环节而已了。在知识分享领域,期望2010年会做得更好。
工作当然不是2009的全部,在这里,我更愿意分享一下在2009里面用相机拍到的精彩瞬间,期望能带来一点亮丽的光彩……

利用Instance Caging实现数据库服务器的资源整合

随着业务的发展,IT部门的服务器数量会越来越庞大,另一方面,这些服务器的利用率却得不到充分利用,于是,服务器的资源整合就被提上了议事日程,这方面的相应的解决方案一般有
Hardware Partitions,
O/S Workload Managers,
Virtualization
等等。
在11gR2中,Oracle也提供了一种简单有效的方法实现对服务器资源的整合,这就是Instance Caging技术……

闲话Linux内核——学习,揣摩与玩味

周末翻阅了以前写在msn space上的文章,不经意间找到了一篇2006年写的关于Linux内核的文章,那时想不到自己会变成一个Database Performance Engineer,不过里面的一些观点却和现在的工作不谋而合,只不过那时面对的Linux Kernel,现在面对的却是Oracle Database……

什么叫做随机查询

在做Exadata相关的培训时,Ad-Hoc Query是经常被提及的一个词,中文的翻译应该就叫做随机查询吧,望文生义,就是随机的,不能预料到的查询。但究竟有多随机呢,一些活生生的例子可能更能说明问题。
我们组设计了一个查询,每次show出来的时候,底下总有人暗底里偷笑不止……

如何分析AWR (5)

有一次跟一个QQ上的朋友一起探讨了另一个对系统CPU进行度量的指标: CPU used by this session。
他刚好有一份AWR报告,在这份报告里,出现了严重的CPU used by this session和DB CPU不一致的现象……

如何分析AWR (4)

构建DSS系统的第一步离不开数据加载,通过文本文件加载是最常见的方式,Oracle提供了外部表加载的方法,即把一个文本文件当成一个正常的表来进行操作,通过类似insert /*+ append */ into table select from external_table的方式进行加载。
数据加载是一个CPU-Bound的过程,不过是通过什么工具,external table也好,sqlldr也好,imp也好,impdp也好。
这个过程的AWR报告会是怎么样子的呢……

如何分析AWR (3)

如何得到系统大致的MBPS呢?
MBPS= (Physical reads + Physical writes) * Block_Size = (196,271.4+2.0)*8*1024/1024/1024 = 1533 MB/s
更准确的MBPS可以从Instance Activity Stats部分获得……