接上文:如何优化并行SQL性能(上) 确保执行计划的所有部分都被并行化了 在复杂的并行SQL语句中,很重要的一点是要确保该查询执行的所有重要步骤都实现了并行。如果某复杂查询的其中一个步骤是串行执行的,其他并行步骤可能也不得不等待该串行步骤完成,这样并行机制的优势就完全丧失了。“PLAN_TABLE”表中的“OTHER_TAG”列用“PARALLEL_FROM_SERIAL”标记指定了这样一个步骤,“DBMS_XPLAN”在“IN-OUT”列中记录了“S->P”。 例如:在下面的例子中表“CUSTOMERS ”是并行化的,但是表“SALES ”不是。
对两个表的连接和“GROUP……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
接上文:如何优化并行SQL性能(上)
确保执行计划的所有部分都被并行化了
在复杂的并行SQL语句中,很重要的一点是要确保该查询执行的所有重要步骤都实现了并行。如果某复杂查询的其中一个步骤是串行执行的,其他并行步骤可能也不得不等待该串行步骤完成,这样并行机制的优势就完全丧失了。“PLAN_TABLE”表中的“OTHER_TAG”列用“PARALLEL_FROM_SERIAL”标记指定了这样一个步骤,“DBMS_XPLAN”在“IN-OUT”列中记录了“S->P”。
例如:在下面的例子中表“CUSTOMERS ”是并行化的,但是表“SALES ”不是。对两个表的连接和“GROUP BY”包括许多并行操作,但是对“SALES ”表的全表扫描不是并行化的,而且登记机(tell-tale)串到并(S->P)标记展示了“SALES”行被串行提取到后续并行操作中:
SQL> ALTER TABLE customers PARALLEL(DEGREE 4); SQL> ALTER TABLE sales NOPARALLEL ; SQL> EXPLAIN PLAN FOR SELECT /*+ ordered use_hash(c) */ cust_last_name, SUM (amount_sold) FROM sales s JOIN customers c USING (cust_id) GROUP BY cust_last_name; SQL> SELECT * FROM table (DBMS_XPLAN.display (NULL, NULL, 'BASIC +PARALLEL')); |
像前面这种情况,部分并行化执行计划可能会导致两方面效果都很差:消耗的时间并没有改善,因为串行操作形成了整个执行的瓶颈。然而,该SQL还捆绑了并行服务器进程,而且可能影响其他并发执行SQL的性能。
如果我们为表“SALES”设置一个默认的并行度,该串行瓶颈就消失了。对“SALES ”表的全扫描现在是按并行执行了,而且“串到并S->P”瓶颈被全并行的“并到并P->P”操作替代了:
在优化并行执行计划时,要确保所有相关步骤都在并行执行:“DBMS_XPLAN”中的串到并S->P 标记或者“PLAN_TABLE”中的“PARALLEL_FROM_SERIAL”通常指示在并行计划的某些方面存在串行瓶颈。
确保请求的DOP是可实现的
超过调优限度增加DOP可能给系统增加额外负载,而不会提升性能。在最坏的情况下,超过调优限度增加DOP可以导致查询运行时间减少。因此,设置合适的DOP对于数据库整体的健康和并行查询的性能优化都是非常重要的。
确保你请求或预期的DOP是现实的;过高的DOP可以导致数据库服务器负载过度,而不会提升SQL的性能。
监视实际DOP
你请求的DOP可能被优化,但是并不总是能成功。当多个并行查询竞争有限的并行执行资源时,DOP可能会减少,或者SQL语句可能会以串行模式运行。
我们前面讨论了Oracle如何决定实际DOP;最重要的参数“PARALLEL_MIN_PERCENT”,“PARALLEL_DEGREE_ POLICY”和“PARALLEL_ADAPTIVE_MULTI_USER”控制了Oracle改变DOP的方式,不管语句运行在降低并行,出错终止,还是在现存资源不足以请求的DOP运行该语句时推迟到后续处理。
DOP的减少可以导致你的并行SQL表现出令人失望的性能。你应该监视查询执行来看是否DOP的减少确实出现了。我们前面看到了我们可以如何使用“V$PQ_TQSTAT”来度量实际DOP,以及我们可以如何利用“V$SYSTAT”统计来度量整体并行降级。
如果你发现降级的并行导致了令人失望的性能,你可能想重新审查你的系统资源(内存,IO带宽),调度并行SQL,或者重新检查服务器配置。可能的选择包括:
- 重新调度SQL,以便它们不要并发运行。Oracle 11g R2可以自动调度SQL,只要你设置“PARALLEL_ DEGREE_POLICY”参数为“AUTO”。
- 调整并行配置参数,以支持更大的并发并行。你可以通过增加“PARALLEL_THREADS_PER_ CPU”或者“PARALLEL_MAX_SERVERS”的值来做到这一点。这里的风险是并行执行的总量将会比你系统能支持的数量要多,这会导致SQL 性能退化。
- 增加你数据库服务器的性能。你可以增加CPU数量,RAC集群中实例的数量,你磁盘阵列中磁盘的数量。
- 调整“PARALLEL_MIN_PERCENT ”参数,使SQL可以运行在较少的并行状态下,而不是报错。
令人失望的并行性能可能是Oracle由于并发负载或者并行执行资源的限制降低了DOP导致的结果。
作者
翻译
相关推荐
-
Collaborate 18大会:了解甲骨文云数据库和应用的进展
在Collaborate 18大会即将举行时,我们会发现,甲骨文用户社区的技术变化会略高于平常水平。 由独立甲 […]
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
Oracle TNS 错误:管理员旷日持久的战斗
TNS经常给IT管理员带来麻烦,而且很难定位。尤其是在Oracle数据库中。本文将介绍如何避免这些常见错误。
-
DBA支招:如何实现Oracle EBS 12.2.5升级
那些对于是否要将EBS进行升级持观望态度的Oracle数据库管理员们可以从一家研究公司获得一些启示。