优化并行执行:Oracle中的串行点与性能问题

1 下载量 107 浏览量 更新于2024-08-27 收藏 303KB PDF 举报
在陈焕生的深入讲解中,他讨论了Oracle的并行执行在现实世界中的挑战与优化。首先,他指出并行操作的有效性往往取决于正确的使用方法,不当使用可能导致并行操作无法充分利用硬件的多核优势,或者执行计划效率低下,未能达到预期的性能提升。以下是几个具体的例子: 1. **rownum的影响**:在SQL查询中使用rownum会导致PXSEND1SLAVE操作,这是因为在为每行分配唯一的rownum值时,数据需要被分发到一个主进程(PX)。这会触发BUFFERSORT等阻塞操作,使得原本可以并行的扫描变得串行化,严重影响执行效率。例如,创建一个表lineorder_skew时,不使用rownum的操作执行速度快,而使用rownum则显著增加执行时间和dbtime。 2. **自定义PL/SQL函数**:如果函数未声明为parallel_enable,即使在并行环境下执行,该函数也会阻止SQL的并行处理。这意味着任何包含这种函数的查询将失去并行优势。 3. **并行DML**:启用并行DML(enable paralleldml)对于支持分布式更新至关重要。如果没有开启,DML操作将不会并行进行,从而限制了数据库的性能提升。 在“数据倾斜对不同分发方式的影响”部分,作者通过对比两种修改数据的方式——基于lo_custkey列或rownum列,展示了数据分布不均(如90%数据为-1)如何影响执行计划。不使用rownum时,执行计划更有效,因为每个PX进程仅负责扫描和统计,无需额外处理rownum的分配。然而,当rownum被引入时,执行计划中出现了额外的PXSEND1SLAVE和BUFFERSORT操作,导致了明显的性能下降。 总结来说,理解并正确运用Oracle的并行执行特性,避免不必要的串行点和阻塞操作,是提高数据库性能的关键。通过实例分析,陈焕生强调了优化SQL语句和函数使用的重要性,以及如何通过调整参数和策略来最大化并行执行的优势。