问题标签 [parallel-query]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
145 浏览

sql - 查询在一个环境中而不是在其他环境中并行运行

我有一个插入到选择查询中,例如:

当我比较 prod 和 UAT 之间的计划时,我看到 UAT 在 4 DOP 中运行,但 prod 没有并行运行。

查询完全相同,并在表级别检查并行性,但 prod 和 UAT 中的 degree=1。

不确定并行运行的原因是什么?

我假设当我们在 /*+ append */ 内部使用时它会选择并行,但为什么它在 prod 中被忽略?

数据库:oracle11g

0 投票
1 回答
492 浏览

oracle - 使用 IDE 工具(如 SQL Developer 或 Toad)的 Oracle 并行查询行为

有一段时间我一直在努力抽出时间来写这个问题并尽可能地解释这个问题,所以请提前原谅我的长文。

我的环境:

  • 在 Red Hat 7(RAC 2 节点)上运行的 Oracle Database 12.2 - 每个节点 16CPU 和 64GB RAM。
  • Parallel Force Local 设置为 TRUE 以强制并行服务器进程只能在启动 SQL 语句的同一节点上执行。

我们有一个非常大的数据库,其中包含许多服务于多个应用程序的模式。大多数应用程序实际上是 PL/SQL 中的批处理引擎,处理亿万条记录,因此出于性能原因,大多数大表都配置了 PARALLEL DEGREE DEFAULT。表已分区并具有高级压缩。

除了一些用于开发目的的报告 BI 工具外,许多最终用户还可以通过 SQL Developer 访问系统(仅在读取模式下)以进行 QA 检查。我从不喜欢,但有时你必须接受事情的本来面目。

为了控制一些事情,我设计了一个特定的登录触发器,它不仅涵盖了审计功能,还涵盖了传入会话的某些方面:

  • 使用 SQL Developer 访问的最终用户可能只打开 2 个会话。
  • 使用 SQL Developer 访问的最终用户运行立即执行 ALTER SESSION DISABLE PARALLEL QUERY。不幸的是,我知道有些用户正在自己激活它。ALTER SESSION ENABLE/DISABLE PARALLEL QUERY 是由 CREATE SESSION 权限或 CONNECT 角色继承的,所以我对此无能为力。
  • 使用 SQL Developer 访问的最终用户被分配到一个特定的配置文件,该配置文件在 CPU、磁盘读取等方面有限制。

登录触发器允许或不允许基于一组附加规则的访问,但出于问题的目的,它们并不重要。

让我们看看在 SQL Developer 上运行的查询如何针对启用了 PARALLEL 的表表现:

设想

我有一个包含 80 亿条记录的表,这些记录被不同的分区分割。用户使用 sql developer 登录并运行此查询

由于该表没有索引,因此 CBO 在 PARALLEL 中运行 TABLE FULL SCAN,使用尽可能多的从属设备。完成需要 6 秒。到目前为止,没有错。

同时我正在监视会话(查询运行时您可以看到所有活动的会话)

查询完成后

到现在为止还挺好。现在让我们在 SQL Developer 中运行另一个查询

该查询几乎立即检索前 1000 行。但是让我们看看数据库的区别

当它运行时

查询完成后,我再次检查,但现在所有从属设备仍然存在并且处于活动状态。我会认为,一旦 QC 完成并标记为非活动状态,Oracle 就会关闭所有从属进程。但它没有

只要会话保持打开状态,QC 将保持非活动状态,从属服务器处于活动状态,因此尽管它们不做任何事情,但它们仍然算作并行服务器。会话关闭或用户运行另一个查询让我注意到并行使用的变化。但是如果用户去喝咖啡,或者去发射或者正在做其他事情,就不会有任何东西。有 100 多个用户同时工作,您可能会想象到头痛。我不得不设计一些解决方法:

  • 我必须在触发器内创建一个新控件来识别 QC 与处于 ACTIVE 状态的从属设备的非活动时间,以便确定用户已经打开了多少会话。
  • 在 1 小时的窗口时间后,我必须创建一个清理过程以断开处于此状态的会话
  • 我不能在配置文件中使用限制会话,因为它们在 QC 或 SLAVES 之间没有区别。
  • 无论我配置了多少东西,有时我会用完并行进程,并且如果在工作时间执行批处理(这种情况经常发生),我有时会面临这些重要进程缺乏并行可用性的问题,因为非活动会话。

我的问题如下:

  • 为什么当 QC 已经完成时,slave 仍然处于 ACTIVE 状态?不应该在 QC 交付结果后立即终止从站吗?
  • 为什么在 SQLPLUS 和 Java 池解决方案(作为 SAP 业务对象)中运行非常相似的查询时不会发生这种行为?
  • 有没有办法禁用最终用户的并行功能,无论他们尝试通过 ENABLE PARALLEL QUERY 还是通过 HINTS 来激活它们?

我为这个冗长的问题道歉,但我不想留下任何东西。我真的很感激对此的任何见解。

谢谢你们。