为什么我不能强迫Oracle 11g为单个SQL查询消耗更多的CPU

 ccmm6688 发布于 2023-02-02 19:13

我有一些在巨大的桌子上运行的大量查询.这些查询似乎是CPU瓶颈,并运行了几个小时.据我所知,Oracle有很多新功能,11g,第2版内部并列化查询的执行.但是无论我在查询中添加什么样的提示,我似乎都不能在数据库框上使用多个CPU.我有一个非常值得尊敬的Solaris机器,有8个CPU,但是每次运行这个查询时,我最终只是将一个CPU推到100%,然后在那里坐了几个小时.

我尝试过的提示是:

SELECT /*+ PARALLEL */ ...
SELECT /*+ PARALLEL(5) */ ...
SELECT /*+ PARALLEL(10) */ ...

在查看盒子上的整体CPU消耗时,这些似乎都不起作用.似乎总是将一个CPU固定在100%.不幸的是,即使解释计划似乎也需要永远运行.我会尝试用不同的提示获得不同的解释计划,看看是否有帮助.有些查询是否可能是不可并行的,即使它们的运行时间是在几小时内?!!?此查询中的主表有3.35亿行.

SQL查询文本:

http://pastie.org/8634380

系统参数:

http://pastie.org/8634383

编辑:

详细的解释计划 - 没有并行性:

http://pastebin.com/HkZgbPpf

优化器相关的系统参数:

http://pastie.org/8639841

进一步编辑: 我们已经联系Oracle了解为什么EXPLAIN PLAN需要超过2个小时.我们正试图运行各种解释计划.

1 个回答
  • 了解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部分可以包含查询未请求并行性的许多原因.

    但为什么我得到那么多的并行服务器呢?

    相关信息分布在几本不同的手册中,这些手册非常有用,但偶尔也不准确或误导.关于并行性有很多神话和许多不好的建议.每个版本的技术都会发生重大变化.

    当您整理所有信誉良好的来源时,影响并行服务器数量的因素列表非常大.下面的列表大致按照我认为最重要的因素排序:

      操作间并行性使用排序或分组的任何查询将分配两倍于DOP的并行服务器.这可能是神话"Oracle分配尽可能多的并行服务器!"的原因.

      查询提示 最好是语句级提示/*+ parallel */,或者可能是对象级提示/*+ noparallel(table1) */.如果计划的特定步骤是串行运行的,通常是因为仅对查询的一部分提供了对象级提示.

      递归SQL某些操作可以并行运行,但可以通过递归SQL进行有效序列化.例如,大插入上的未缓存序列.生成的用于解析语句的递归SQL也将是串行的; 例如动态采样查询.

      更改会话 alter session [force|enable] parallel [query|dml|ddl]; 请注意,默认情况下禁用并行DML.

      表学位

      指数学位

      索引更便宜 并行提示只告诉优化器考虑使用某个DOP进行全表扫描.它们实际上并不强制并行性.如果认为它更便宜,优化器仍然可以自由使用串行索引访问.(FULL提示可能有助于解决此问题.)

      计划管理 SQL计划基准,大纲,配置文件,高级重写和SQL转换程序都可以改变背后的并行度.查看计划的"注释"部分.

      企业和个人版允许并行操作.包DBMS_PARALLEL_EXECUTE除外.

      PARALLEL_ADAPTIVE_MULTI_USER

      PARALLEL_AUTOMATIC_TUNING

      PARALLEL_DEGREE_LIMIT

      PARALLEL_DEGREE_POLICY

      PARALLEL_FORCE_LOCAL

      PARALLEL_INSTANCE_GROUP

      PARALLEL_IO_CAP_ENABLED

      PARALLEL_MAX_SERVERS 这是整个系统的上限.这里有一个权衡.一次运行太多并行服务器对系统不利.但是,对于某些查询,将查询降级为串行可能是灾难性的.

      PARALLEL_MIN_PERCENT

      PARALLEL_MIN_SERVERS

      PARALLEL_MIN_TIME_THRESHOLD

      PARALLEL_SERVERS_TARGET

      PARALLEL_THREADS_PER_CPU

      RAC节点数默认DOP的另一个乘数.

      CPU_COUNT如果使用默认DOP.

      RECOVERY_PARALLELISM

      FAST_START_PARALLEL_ROLLBACK

      Profile SESSIONS_PER_USER还限制了并行服务器.

      资源经理

      系统加载 如果parallel_adaptive_multi_user为true.可能无法猜测Oracle何时会开始限制.

      PROCESSES

      并行DML限制如果出现以下任何一种情况,并行DML将无法工作:

        兼容<9.2用于分区内

        INSERT VALUES,带触发器的表

        复制

        自引用完整性或删除级联或延迟完整性约束

        访问对象列

        带有LOB的非分区表

        与LOB的分区内并行性

        分布式交易

        集群表

        临时表

      标量子查询不并行运行? 这是在手册中,我希望这真的,但我的测试表明并行性在这里工作在11g.

      ENQUEUE_RESOURCES 10g中的隐藏参数,这是否相关?

      索引组织表不能并行路径到IOT的直接路径?(这仍然是真的吗?)

      并行流水线功能要求必须使用CURSOR(?).去做.

      函数必须是PARALLEL_ENABLE

      语句类型旧版本根据分区限制DML上的并行性.目前的一些手册仍然包括这一点,但它肯定不再适用.

      分区数仅适用于旧版本的分区连接.(?)

      错误特别是我已经看到很多解析错误.Oracle将分配正确数量的并行服务器,但不会发生任何事情,因为它们都在等待像这样的事件cursor: pin s wait on x.

    此列表肯定不完整,不包括12c功能.它没有解决操作系统和硬件问题.它并没有回答这个非常棘手的难题,"并行度的最佳程度是什么?" (简短的回答:通常更好,但牺牲其他过程.)希望它至少让你了解这些问题有多困难,并且是一个开始寻找的好地方.

    2023-02-02 19:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有