NG *_*lgo 4 sql oracle parallel-processing
我有一些在巨大的桌子上运行的大量查询.这些查询似乎是CPU瓶颈,并运行了几个小时.据我所知,Oracle有很多新功能,11g,第2版内部并列化查询的执行.但是无论我在查询中添加什么样的提示,我似乎都不能在数据库框上使用多个CPU.我有一个非常值得尊敬的Solaris机器,有8个CPU,但是每次运行这个查询时,我最终只是将一个CPU推到100%,然后在那里坐了几个小时.
我尝试过的提示是:
SELECT /*+ PARALLEL */ ...
SELECT /*+ PARALLEL(5) */ ...
SELECT /*+ PARALLEL(10) */ ...
Run Code Online (Sandbox Code Playgroud)
在查看盒子上的整体CPU消耗时,这些似乎都不起作用.似乎总是将一个CPU固定在100%.不幸的是,即使解释计划似乎也需要永远运行.我会尝试用不同的提示获得不同的解释计划,看看是否有帮助.有些查询是否可能是不可并行的,即使它们的运行时间是在几小时内?!!?此查询中的主表有3.35亿行.
SQL查询文本:
系统参数:
编辑:
详细的解释计划 - 没有并行性:
优化器相关的系统参数:
进一步编辑: 我们已经联系Oracle了解为什么EXPLAIN PLAN需要超过2个小时.我们正试图运行各种解释计划.
Jon*_*ler 12
了解Oracle并行性最重要的是它很复杂.优化并行性需要大量的Oracle知识,阅读手册,检查许多参数,测试长时间运行的查询以及许多怀疑.
问正确的问题
并行问题确实涉及三个不同的问题:
使用最佳工具
直接使用最佳工具 - 带有活动报告的SQL监控.找到您的SQL_ID并生成HTML报告:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;.这是了解执行计划中每个步骤花费了多少时间的唯一方法.它会告诉你有效使用了多少并行性,以及在哪里.例如:

另一个不错的选择是type => 'text'.它没有那么多的信息,但它更容易看,更容易分享.
SQL Monitoring还包括请求的DOP和分配的DOP:

100行并行select可以运行得很漂亮,但是由于未缓存的序列,所有内容都会在一步中停止.你可以盯着解释计划,追踪或AWR报告几个小时,而不是看到问题.活动报告使得缓慢的步骤几乎无足轻重.不要浪费时间猜测问题所在.
但是,仍然需要其他工具.用explain plan for ...和生成的解释计划select * from table(dbms_xplan.display); 将提供一些关键信息.具体而言,该Notes部分可以包含查询未请求并行性的许多原因.
但为什么我得到那么多的并行服务器呢?
相关信息分布在几本不同的手册中,这些手册非常有用,但偶尔也不准确或误导.关于并行性有很多神话和许多不好的建议.每个版本的技术都会发生重大变化.
当您整理所有信誉良好的来源时,影响并行服务器数量的因素列表非常大.下面的列表大致按照我认为最重要的因素排序:
/*+ parallel */,或者可能是对象级提示/*+ noparallel(table1) */.如果计划的特定步骤是串行运行的,通常是因为仅对查询的一部分提供了对象级提示.alter session [force|enable] parallel [query|dml|ddl]; 请注意,默认情况下禁用并行DML.FULL提示可能有助于解决此问题.)SESSIONS_PER_USER还限制了并行服务器.CURSOR(?).去做.cursor: pin s wait on x.此列表肯定不完整,不包括12c功能.它没有解决操作系统和硬件问题.它并没有回答这个非常棘手的难题,"并行度的最佳程度是什么?" (简短的回答:通常更好,但牺牲其他过程.)希望它至少让你了解这些问题有多困难,并且是一个开始寻找的好地方.