解决并行SQL性能问题:进程间负载

日期: 2010-11-28 作者:Guy Harrison翻译:冯昀晖 来源:TechTarget中国 英文

在步骤中的每一个进程都有相同数量的工作要做时,并行处理的效果最好。如果一个伺服进程比另一个进程有更多的工作要做,“空闲”进程将要等待“繁忙”进程,而且我们不会获得与为该SQL工作的进程数量相应的性能提升。   Oracle采用的大部分算法都是为达成均衡的数据分配而设计的,这些算法包括“HASH”,“ROUND ROBIN”和“RANDOM”分布机制。然而,当执行排序操作时,Oracle不能使用这些随机的或者伪随机的机制。

相反,Oracle必须基于排序字段列分配数据给伺服进程。我们在图12-2中看到的例子,一个并行进程提取从A到K的行,给一个伺服进程来排序,从L到Z行给了另一个进程。   如果在……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

在步骤中的每一个进程都有相同数量的工作要做时,并行处理的效果最好。如果一个伺服进程比另一个进程有更多的工作要做,“空闲”进程将要等待“繁忙”进程,而且我们不会获得与为该SQL工作的进程数量相应的性能提升。

  Oracle采用的大部分算法都是为达成均衡的数据分配而设计的,这些算法包括“HASH”,“ROUND ROBIN”和“RANDOM”分布机制。然而,当执行排序操作时,Oracle不能使用这些随机的或者伪随机的机制。相反,Oracle必须基于排序字段列分配数据给伺服进程。我们在图12-2中看到的例子,一个并行进程提取从A到K的行,给一个伺服进程来排序,从L到Z行给了另一个进程。

  如果在排序列的数据分配非常不平衡,这种分配可能就是不均衡的。例如,请看下面这个简单的查询:

  SQL> EXPLAIN PLAN
  FOR
  SELECT /*+ parallel */
  cust_last_name, cust_first_name, cust_year_of_birth
  FROM customers
  ORDER BY CUST_LAST_NAME;

  在前面的步骤五,Oracle从一组伺服进程到另一组分配数据,基于排序列包含的值范围进行。如果数据分布良好,一切就都很好。然而,如果数据分配严重倾斜(可能我们的数据中有数量特别大的Smiths和Zhangs),对伺服进程的数据分布可能就不均衡了。例如,下面的“V$PQ_TQSTAT”输出展示了这样一种不平衡分布,一个伺服进程分配的数据是另一个的两倍(我故意倾斜分布客户姓氏来做到这一点的):

  SQL> SELECT dfo_number, tq_id, server_Type, MIN (num_rows),
  MAX (num_rows), COUNT ( * ) dop
  FROM v$pq_tqstat
  GROUP BY dfo_number, tq_id, server_Type
  ORDER BY dfo_number, tq_id, server_type DESC;

  不幸的是,对于这种数据分布倾斜我们可能也无能为力。Oracle在并行伺服进程之间分配数据行时,似乎没有把数据平行分布考虑进来。如果行分布看起来特别的不平衡,你可以考虑改变DOP或者审查该SQL是否真的适合并行处理。

  有效的并行机制依赖于跨并行伺服进程均衡的处理分布。“V$PQ_TQSTAT”使你可以计算跨并行伺服进程的负责均衡效率。

相关推荐