加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

AWR实战分析之----PX Deq Credit: send blkd

(2013-11-11 13:53:50)
标签:

directpathread

pxdeqcreditsendblkd

王显伟

等待事件分析

it

分类: AWR案例分析

    早上巡检数据库时发现报表数据库负载有些异常,取了当时的AWR进行分析,发现一个从未见过的等待事件,记录一下分析过程:

    http://s5/mw690/001N2SGity6E8sLDTsof4&690Deq Credit: send blkd" TITLE="AWR实战分析之----PX Deq Credit: send blkd" />

    从上图看,会话数量和DB Time相对平时偏大,更何况发生的时间是零辰,有点小奇怪,看看TOP 5
    http://s13/mw690/001N2SGity6E8sLFfDCfc&690Deq Credit: send blkd" TITLE="AWR实战分析之----PX Deq Credit: send blkd" />

    从TOP 5上看,排在第一位的是direct path read它的产生原理:

1.与直接读取相关联的等待事件。当ORACLE将数据块直接读入会话的PGA(进程全局区)中,同时绕过SGA(系统全局区)。PGA中的数据并不和其他的会话共享。即表明,读入的这部分数据该会话独自使用,不放于共享的SGA中。
2.在排序操作(order by/group by/union/distinct/rollup/合并连接)时,由于PGA中的SORT_AREA_SIZE空间不足,造成需要使用临时表空间来保存中间结果,当从临时表空间读入排序结果时,产生direct path read等待事件
3.使用HASH连接的SQL语句,将不适合位于内存中的散列分区刷新到临时表空间中。为了查明匹配SQL谓词的行,临时表空间中的散列分区被读回到内存中(目的是为了查明匹配SQL谓词的行),ORALCE会话在direct path read等待事件上等待。
4.使用并行扫描的SQL语句也会影响系统范围的direct path read等待事件。在并行执行过程中,direct path read等待事件与从属查询有关,而与父查询无关,运行父查询的会话基本上会在PX Deq:Execute Reply上等待,从属查询会产生direct path read等待事件。
   

    可是在这里我们没有看到所谓的PX Deq:Execute Reply等待事件,但是发现了和它相似的PX Deq Credit: send blkd 经过查询官网发现,PX Deq Credit: send blkd PX Deq Credit: need buffer 

    官方解释产生原因如下:

     1.有大量的不同进程之间的数据和信息的交互导致等待。原因可能是一个比较糟糕的执行计划用于了并行执行。
     2.等待是由于资源的问题,如CPU或相互连接等。例如CPU利用率达到100%,进程达到了CPU的限制,而不能足够快地发送数据。
     3.由于并行查询hang住,如等待事件为"PX Deq Credit: need buffer"。

    说明: Deq = DEQUEUE,这是一个关于出队的等待;  PX等待事件发生在并行查询的不同进程之间交互数据或信息时。 这些等待事件在系统负载很轻的时候,大都是没问题的,但是当系统的负载很重,此类等待事件已经进入top5等待事件中那就需要注意了,在查询gv$等视图和并行查询都会产生此类等待事件。

    两个TOP 5中的等待事件都指向了并行查询,然后我看了一下TOP SQL,才发现问题产生的原因,请看下图

http://s2/mw690/001N2SGity6E8utks5r31&690Deq Credit: send blkd" TITLE="AWR实战分析之----PX Deq Credit: send blkd" />
    发现 "BEGIN sys.dbms_stats.gahter_sc......."在下面的TOP SQL模块中都排在第一位   

    SQL ordered by CPU Time

    SQL ordered by Gets

    SQL ordered by Reads

    原来产生的原因是收集统计信息语句块指定并行度引起起的,脚本如下:

BEGIN
  sys.dbms_stats.gather_schema_stats(ownname          => 'CUECM',
                                     estimate_percent => dbms_stats.auto_sample_size,
                                     method_opt       => 'FOR ALL INDEXED COLUMNS SIZE AUTO',
                                     cascade          => true,
                                     options          => 'GATHER AUTO',
                                     degree           => 8);
END;

    该脚本是我时凌晨时分手工执行的统计信息收集脚本,并行度过高!经过查询联机文档,官方建议采用自动确定并行度,脚本修改如下

BEGIN
  sys.dbms_stats.gather_schema_stats(ownname          => 'CUECM',
                                     estimate_percent => dbms_stats.auto_sample_size,
                                     method_opt       => 'FOR ALL INDEXED COLUMNS SIZE AUTO',
                                     cascade          => true,
                                     options          => 'GATHER AUTO',
                                     degree           => dbms_stats.auto_degree);

END;

    官网相关文档:738464.1

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有