在数据库级别减少PX DEQ CREDIT SEND BLKD等待的秘诀
适用于:
适用的数据库版本:企业版9i~11gr1
目的:
这个短文给我们一些在数据库级别上查询什么可以减少“PX Deq Credit”和“PX Deq Credit”等待时间的建议
适用范围和应用
为DBA
减少PX DEQ CREDIT SEND BLKD等待的秘诀
等待事件"PX Deq Credit: need buffer" 和 "PX Deq Credit: send blkd"的发生,是在部分查询时,数据或信息通过另外的进程被改变了。至少有3个不同的主要问题可以导致这种等待事件。第一:当有大量的数据和信息在并发线程中被改变,我们可以看到很高的等待事件。导致这个原因可能是由于执行计划不对或者并发设置不对。第二:CPU资源或者接口上有问题。例如,一个CPU资源达到100%,进程就被CPU控制而不能快速传递数据。第三:并发查询被hang住了,因为一个进程出现PX Deq Credit: need buffer等待事件。例如,在此我们不讨论第3点和第2点。(1)并发深度设置:在数据库上,你应该检查你的并行设置。例如,"alter index <indexname> rebuild parallel 4;",会导致一个深度为4的索引,尽管意图用4个并发量重建索引,但是不改变索引的深度。最好是运行SQL命令。NOTE.2708371.1中报告了表和索引的并发深度设置。在NOTE. 2708371.1的第四个命令可以显示一个关于索引和表的并发深度设置。下面是一个输出例子
OWNER TABLE_NAME DEGREE INSTANCES INDEX_NAME DEGREE INSTANCES
------ ------------ ------- --------- ------------ ------- ---------
SCOTT DEPT 1 1 PK_DEPT 4 1
SCOTT EMP 1 1 PK_EMP DEFAULT DEFAULT
上面的输出例子中,我们看到索引PK_DEPT 和 PK_EMP有一个并发深度设置,但是数据库基本没有。这里你应该将索引设置成非并发模式。可以通过alter index SCOTT.PK_DEPT noparallel;语句实现。第二个脚本很有用,去获得一个对象的深度并发设置信息。下面是一个输出的例子
OWNER DEGREE INSTANCES Num Tables 'PARALLE
------ ---------- ---------- ---------- --------
OSS 1 1 126 Serial
OSS 8 1 1 Parallel
通过上面的结果我们看到,只有一个表有8的并发深度这是在对象OSS中。可能他不计划有一个并发深度8的表。你应该找到那个表并且将这个表设置成飞并发。你应该对这个对象用select table_name from all_tables where ( trim(degree) != '1' and trim(degree) != '0' ) or
( trim(instances) != '1' and trim(instances) != '0' ) and owner = 'OSS'; 查询语句,找到那个对象。
结果显示为:
------------------------------
OSS_EMP
改变表的非并发设置,可以执行alter table OSS.OSS_EMP noparallel; 减少并发查询的数量来保证数据的传输。
上面的SQL语句也很有用去检查对象(表/索引)的并发深度不是很高。例如,在大多数i情况下,表/索引小于200MB时,默认的参数是很好的,不需设置并发深度。有时候增加参数PARALLEL_EXECUTION_MESSAGE_SIZE的大小,可能会引起PX msg pool。