为什么我似乎无法强制 Oracle 11g 为单个 SQL 查询消耗更多 CPU

2023-11-26

我有一些在巨大的表上运行的巨大查询。这些查询似乎存在 CPU 瓶颈,并且运行了数小时。据我所知,Oracle 在 11g 第 2 版中有很多新功能,可以在内部并行化查询的执行。然而,无论我在查询中添加何种提示,我似乎都无法在数据库框中使用超过 1 个 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

Edit:

详细解释计划 - 无并行性:

http://pastebin.com/HkZgbPpf

优化器相关系统参数:

http://pastie.org/8639841

进一步编辑:我们已联系 Oracle 以了解为什么 EXPLAIN PLAN 需要 2 个多小时。我们尝试运行各种解释计划时超时了。


了解 Oracle 并行性最重要的一点是它很复杂。优化并行性需要大量的 Oracle 知识、阅读手册、检查许多参数、测试长时间运行的查询以及大量的怀疑精神。

提出正确的问题

并行问题实际上涉及三个不同的问题:

  1. 请求了多少个并行服务器?
  2. 分配了多少个并行服务器?
  3. 有多少并行服务器被有效使用?

使用最好的工具

Go straight to the best tool - SQL Monitoring with active reports. Find your SQL_ID and generate the HTML report: select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;. This is the only way to know how much time was spent on each step in the execution plan. And it will tell you how much parallelism was effectively used, and where. For example: enter image description here

另一个不错的选择是type => 'text'。它没有那么多信息,但查看起来更快,也更容易共享。

SQL Monitoring also includes the DOP requested and the DOP allocated: enter image description here

100线平行select可能会运行得很好,但是由于未缓存的序列,一切都会在一步中停止。您可以盯着解释计划、跟踪或 AWR 报告几个小时,却看不到问题。活跃的报告使得缓慢的步骤变得几乎微不足道。不要浪费时间猜测问题出在哪里。

然而,仍然需要其他工具。生成的解释计划explain plan for ... and select * from table(dbms_xplan.display);将提供一些关键信息。具体来说Notes部分可以包含查询不请求并行性的许多原因。

但为什么我要获得这么多并行服务器呢?

相关信息分布在几个不同的手册中,这些手册非常有用,但有时不准确或具有误导性。关于并行性有很多误解和很多不好的建议。每个版本的技术都会发生显着变化。

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

  1. 操作间并行性任何使用排序或分组的查询将分配两倍于 DOP 的并行服务器。这可能就是“Oracle 分配尽可能多的并行服务器!”这一神话的原因。
  2. 查询提示最好是语句级提示,例如/*+ parallel */,或者可能是对象级提示,例如/*+ noparallel(table1) */。如果计划的特定步骤连续运行,通常是因为仅对部分查询进行了对象级提示。
  3. 递归SQL某些操作可能并行运行,但可以通过递归 SQL 有效地序列化。例如,大型插入上的未缓存序列。生成解析语句的递归SQL也将是串行的;例如动态采样查询。
  4. 改变会话 alter session [force|enable] parallel [query|dml|ddl];请注意,默认情况下禁用并行 DML。
  5. 表度
  6. 指标度
  7. 指数更便宜并行提示仅告诉优化器考虑使用特定 DOP 进行全表扫描。它们实际上并不强制并行。如果优化器认为串行索引访问更便宜,它仍然可以自由地使用它。 (这FULL提示可能有助于解决这个问题。)
  8. 计划管理SQL 计划基线、大纲、概要文件、高级重写和 SQL 翻译器都可以在您背后改变并行度。检查计划的注释部分。
  9. Edition只有企业版和个人版允许并行操作。除了包裹DBMS_PARALLEL_EXECUTE.
  10. PARALLEL_ADAPTIVE_MULTI_USER
  11. 并行自动调整
  12. PARALLEL_DEGREE_LIMIT
  13. PARALLEL_DEGREE_POLICY
  14. PARALLEL_FORCE_LOCAL
  15. 并行实例组
  16. PARALLEL_IO_CAP_ENABLED
  17. PARALLEL_MAX_SERVERS这是整个系统的上限。这里有一个权衡。同时运行太多并行服务器对系统不利。但是对于某些查询来说,将查询降级为串行查询可能会带来灾难性的后果。
  18. PARALLEL_MIN_PERCENT
  19. PARALLEL_MIN_SERVERS 个
  20. PARALLEL_MIN_TIME_THRESHOLD
  21. PARALLEL_SERVERS_TARGET
  22. 每个 CPU 并行线程数
  23. RAC节点数量默认 DOP 的另一个乘数。
  24. CPU_COUNT如果使用默认的 DOP。
  25. 恢复并行
  26. FAST_START_PARALLEL_ROLLBACK
  27. Profile SESSIONS_PER_USER还限制并行服务器。
  28. 资源管理器
  29. 系统负载如果parallel_adaptive_multi_user为true。可能无法猜测 Oracle 何时会开始限制。
  30. 流程
  31. Parallel DML restrictions Parallel DML will not work if any of these cases:
    1. 对于分区内兼容
    2. INSERT VALUES,带有触发器的表
    3. 复制
    4. 自引用完整性或删除级联或延迟完整性约束
    5. 访问对象列
    6. 带有 LOB 的非分区表
    7. 具有 LOB 的分区内并行性
    8. 分布式事务
    9. 聚簇表
    10. 临时表
  32. 标量子查询不并行运行?这是手册上的,我希望这个was确实如此,但我的测试表明并行性在 11g 中有效。
  33. 排队资源10g 中的隐藏参数,这还有关系吗?
  34. 索引组织表无法并行直接路径插入到物联网吗? (这仍然是真的吗?)
  35. 并行流水线功能需求必须使用一个CURSOR(?)。去做。
  36. 函数必须是 PARALLEL_ENABLE
  37. 声明类型旧版本根据分区限制 DML 的并行性。当前的一些手册仍然包含这一点,但它肯定不再正确了。
  38. 分区数量仅适用于旧版本上的分区明智连接。(?)
  39. Bugs具体来说,我看到了很多解析错误。 Oracle 将分配正确数量的并行服务器,但什么也不会发生,因为它们都在等待类似的事件cursor: pin s wait on x.

这个列表当然不完整,并且不包括 12c 功能。而且它不解决操作系统和硬件问题。而且它没有回答这个极其困难的问题:“最好的并行度是多少?” (简短的回答:通常越多越好,但会牺牲其他流程。)希望它至少能让您了解这些问题有多么困难,并且是一个开始寻找的好地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我似乎无法强制 Oracle 11g 为单个 SQL 查询消耗更多 CPU 的相关文章

随机推荐

  • mongo组查询如何保留字段

    大家 在 mongo 组查询中 结果仅显示参数中的键 如何像mysql查询组一样保留每个组中的第一个文档 例如 name age sex province city area address ddl1st 22 纯爷们 BeiJing Be
  • 使用 CSS 仅针对 Firefox

    使用条件注释 可以轻松地使用特定于浏览器的 CSS 规则来定位 Internet Explorer 有时 Gecko 引擎 Firefox 会出现问题 使用 CSS 规则仅针对 Firefox 而不是其他浏览器的最佳方法是什么 也就是说 不
  • 如何使用用户 ID 参数下载 MSI 安装程序

    我有一个 NET C 应用程序 包含在 MSI 安装程序中 myprogram exe 我有一个 PHP 网站和一个特定页面 用户可以通过链接下载该程序 我希望能够跟踪 NET 应用程序上的某些事件 例如 程序已打开 将事件发送到我的服务器
  • 返回每组一列最大值的行[重复]

    这个问题在这里已经有答案了 如果不搜索同一个表至少两次以获取最大行 然后获取该行的值 我很难做到这一点 所讨论的表相当大 因此这是不可接受的 我的桌子可能是这样的 SCORES ID ROUND SCORE 1 1 3 1 2 6 1 3
  • 是否可以在 0.0.0.0 而不是 127.0.0.1 上启动 Vault 开发服务器?

    我有一个 Hashicorp Vault 服务器在 AWS EC2 实例上运行 地址为 127 0 0 1 8200 在我的安全组的入站规则中 我启用了 TCP 8200 但是 我无法从本地计算机访问 Vault 服务器 我认为这是因为开发
  • Clojure:减少与应用

    我理解之间的概念差异reduce and apply reduce list 1 2 3 4 5 translates to 1 2 3 4 5 apply list 1 2 3 4 5 translates to 1 2 3 4 5 然而
  • 如何从MySql中的表中删除最后一条记录(有条件)

    我有一个登录时间像这样的表 id user id datetime 1 1 2011 01 17 18 51 05 2 1 2011 01 18 18 51 05 3 1 2011 01 19 18 51 05 4 2 2011 01 19
  • 获取连接到 SignalR hub 的侦听器和客户端的数量

    有没有办法找出侦听器的数量 连接到集线器的客户端 如果至少有一个客户端已连接 我正在尝试运行 启动一项任务 否则不启动它 HubName taskActionStatus public class TaskActionStatus Hub
  • 致命:不是 git 存储库:“.git”错误

    我创建了一个预提交挂钩 它获取数据库转储并将其保存在我的应用程序 文件夹下的文件中 该文件也在 git 存储库中 保存后我将文件添加到提交列表中 以下是我的预提交文件中的代码 D xampp mysql bin mysqldump u ro
  • python:用条件替换列表中的元素

    我正在尝试使用 python 执行以下操作 但出现了奇怪的行为 假设我有以下列表 x 5 4 3 2 1 现在 我正在做类似的事情 x x gt 3 3 这给出 x 5 3 3 2 1 为什么只有第二个元素发生变化 我期待着 3 3 3 2
  • VBscript 相对路径

    我正在尝试使用以下脚本 顺便说一下 它是由批处理文件调用的 在 Windows XP 中解压缩文件 strZipFile C test zip name of zip file outFolder C destination folder
  • DateTime.ParseExact FormatException 字符串未被识别为有效的日期时间

    我完全被这个难住了 据我所知 我读过的文档和其他帖子都说这应该可行 我一定错过了一些愚蠢的东西 但我就是看不到它 我收到一个 FormatException 消息 字符串未被识别为有效的日期时间 在以下代码行上 return DateTim
  • 全局命名空间与本地命名空间性能差异

    为什么在一个函数中执行一组命令 def main do stuff return something print main 会倾向于跑步1 5x to 3x在 python 中执行命令比在顶层执行命令快几倍 do stuff print s
  • 安装 davfs2 卷时无法打开 docker 容器中的熔断器设备

    当我尝试在 docker 容器上挂载 davfs2 卷时遇到以下错误 geoserver 8e8091d97157 mount owncloud sbin mount davfs loading kernel module fuse sbi
  • 如何在Python中的for循环中删除列表元素? [复制]

    这个问题在这里已经有答案了 我有一个清单 a a b c d e 我想在 for 循环中删除此列表中的元素 如下所示 for item in a print item a remove item 但这不起作用 我能做些什么 不允许在使用 a
  • DDK“你好世界”

    如何开始为 Windows 编写驱动程序 是否有某种官方 DDK Hello World 示例 虽然我确信一开始这会超出我的想象 但最终我想创建一个简单的 MIDI 驱动程序 就像枫木虚拟 MIDI 电缆其中 MIDI 消息来自用户应用程序
  • 将 div 高度设置为父级的 100%

    我想要我的网页具有以下布局 header navigation details 其中导航窗格 动态生成的内容 包含数百个元素 我希望在导航窗格上创建一个垂直滚动条 以便该窗格的高度减去标题的高度 我的页面大致结构如下 div div div
  • 在 Mac OS X 上的 Docker 中启用远程 API (boot2docker)

    我似乎不知道如何在使用 boot2docker 时启用远程 API 我尝试按如下方式使用 dockerode Docker require dockerode docker new Docker socketPath var run doc
  • JVM 内存:为什么任务管理器上的内存与 JProbe(或 JConsole 工具)不同

    我面临的问题是我的应用程序使用的内存只有100MB 之后减少了50MB 但在窗口任务管理器上它显示150MB并且总是保持或增加但不减少 我们如何减少任务管理器上的内存 私人工作集 你所看到的JConsole 或其他监控工具 是java内存正
  • 为什么我似乎无法强制 Oracle 11g 为单个 SQL 查询消耗更多 CPU

    我有一些在巨大的表上运行的巨大查询 这些查询似乎存在 CPU 瓶颈 并且运行了数小时 据我所知 Oracle 在 11g 第 2 版中有很多新功能 可以在内部并行化查询的执行 然而 无论我在查询中添加何种提示 我似乎都无法在数据库框中使用超