【问题标题】:why the cost of a query reduces using parallel hint?为什么使用并行提示可以降低查询成本?
【发布时间】:2021-06-25 20:36:01
【问题描述】:

在 Oracle 12C 中,我有这个查询

select 
* from my_table t;

如果我简单解释一下,我得到的成本是 235597

如果我像这样添加并行提示

select /*+ parallel(16) */
* from my_table t;

解释计划给出的成本16349

大约少14倍

虽然我了解查询将使用 16 个线程来解决查询, 我不明白为什么会降低成本,我什至希望为了管理线程而付出更多的成本。 如果你有 100 美元,然后将 100 美元分给 16 个人,你仍然会少 100 美元。

【问题讨论】:

  • 嗨,Leo,请向我们提供您的执行计划,无论是否有提示。谢谢

标签: oracle oracle12c sql-execution-plan explain


【解决方案1】:

我和 Jon 看过同一本书 :-)。举个例子:

CREATE TABLE my_table (id NUMBER, c VARCHAR2(4000));
INSERT /*+ APPEND*/ INTO my_table(id, c)
  SELECT object_id, LPAD(object_name, 3800, 'x') 
    FROM all_objects WHERE rownum <= 50000;
EXEC DBMS_STATS.SET_TABLE_STATS(USER, 'my_table');

如果您以不同程度的并行度运行查询,您将准确得出 Jon 提到的成本估算值。除了解释计划的估计成本外,我还注意到了以秒为单位测量的运行时间:

SELECT /*+ PARALLEL(t, 1) */ count(*) FROM my_table t;
SELECT /*+ PARALLEL(t, 2) */ count(*) FROM my_table t;
SELECT /*+ PARALLEL(t, 3) */ count(*) FROM my_table t;
SELECT /*+ PARALLEL(t, 4) */ count(*) FROM my_table t;


Parallel   cost  seconds
       1  13635     1.27
       2   7570     1.29
       3   5046     1.32
       4   3785     1.35

因此,优化器估计并行运行时成本会降低。但是,如果他们在现实中这样做是另一回事。

【讨论】:

    【解决方案2】:

    成本是优化器创建的一个幻数,用于选择最快执行计划,不一定是最效率计划。为了比较串行和并行计划,Oracle 根据并行度划分并行计划的成本。

    对于串行计划,成本和资源消耗呈正相关,因此速度和效率之间没有冲突。但是并行性总是比等效的串行操作需要更多的开销 - 要求并行性隐含地要求优化器忽略效率而只优化速度。

    但是当我们要求并行时,Oracle 仍然必须考虑非并行执行计划。即使我们要求/*+ parallel(256) */,而我们的系统有核和IO的尴尬,最快的执行计划可能是具有唯一索引的串行计划。

    为了比较串行和并行的执行时间,Oracle 将 N 度的成本计算为ceil(serial cost / (0.9 * N))。 0.9 很有用,因为并行改进绝不是严格意义上的线程数的倍数。该等式来自 Jonathan Lewis 的《基于成本的 Oracle 基础知识》一书。对于您问题中的成本,ceil(235597 / (0.9 * 16)) = 16361,这与您的最终成本 16349 非常接近。

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2022-07-19
      • 2020-04-27
      • 2021-12-27
      相关资源
      最近更新 更多