【问题标题】:Which of the following three is the optimum Oracle SQL plan?以下哪三个是最优的 Oracle SQL 计划?
【发布时间】:2021-02-18 11:50:14
【问题描述】:

以下三个查询产生相同的数据。 请检查这些查询,让我知道您对最佳计划的反馈。 另外,我如何才能找到查询的总体最终成本?

 *****************Plan: 1***************** With Parallel
Plan hash value: 5652955961
 
----------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |           | 54279 |  1855K|       |   200   (2)| 00:00:01 |       |       |        |      |            |
|   1 |  PX COORDINATOR             |           |       |       |       |            |          |       |       |        |      |            |
|   2 |   PX SEND QC (RANDOM)       | :TQ10001  | 54279 |  1855K|       |   200   (2)| 00:00:01 |       |       |  Q1,01 | P->S | QC (RAND)  |
|   3 |    HASH GROUP BY            |           | 54279 |  1855K|  2776K|   200   (2)| 00:00:01 |       |       |  Q1,01 | PCWP |            |
|   4 |     PX RECEIVE              |           | 54279 |  1855K|       |   200   (2)| 00:00:01 |       |       |  Q1,01 | PCWP |            |
|   5 |      PX SEND HASH           | :TQ10000  | 54279 |  1855K|       |   200   (2)| 00:00:01 |       |       |  Q1,00 | P->P | HASH       |
|   6 |       HASH GROUP BY         |           | 54279 |  1855K|  2776K|   200   (2)| 00:00:01 |       |       |  Q1,00 | PCWP |            |
|   7 |        PX PARTITION HASH ALL|           | 54279 |  1855K|       |   199   (2)| 00:00:01 |     1 |   256 |  Q1,00 | PCWC |            |
|*  8 |         TABLE ACCESS FULL   | T_EMPLOYEE | 54279 |  1855K|       |   199   (2)| 00:00:01 |     1 |   256 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   8 - filter("DD"."COL1"=1 AND "DD"."COL2"=1 AND "DD"."COL3"=0)
 
Note
-----
   - Degree of Parallelism is 16 because of table property

************Plan: 2******************** normal
Plan hash value: 54134798
 
---------------------------------------------------------------------------------------------------------
| Id  | Operation           | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |           | 54279 |  1855K|       |  3310   (2)| 00:00:01 |       |       |
|   1 |  HASH GROUP BY      |           | 54279 |  1855K|  2776K|  3310   (2)| 00:00:01 |       |       |
|   2 |   PARTITION HASH ALL|           | 54279 |  1855K|       |  2867   (2)| 00:00:01 |     1 |   256 |
|*  3 |    TABLE ACCESS FULL| T_EMPLOYEE | 54279 |  1855K|       |  2867   (2)| 00:00:01 |     1 |   256 |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   3 - filter("DD"."COL1"=1 AND "DD"."COL2"=1 AND "DD"."COL3"=0)

************Plan: 3******************** with sub_query
Plan hash value: 883964996
 
-----------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           | 54279 |    14M|       |  3313   (2)| 00:00:01 |       |       |
|   1 |  HASH GROUP BY        |           | 54279 |    14M|       |  3313   (2)| 00:00:01 |       |       |
|   2 |   VIEW                |           | 54279 |    14M|       |  3310   (2)| 00:00:01 |       |       |
|   3 |    HASH GROUP BY      |           | 54279 |  1855K|  2776K|  3310   (2)| 00:00:01 |       |       |
|   4 |     PARTITION HASH ALL|           | 54279 |  1855K|       |  2867   (2)| 00:00:01 |     1 |   256 |
|*  5 |      TABLE ACCESS FULL| T_EMPLOYEE | 54279 |  1855K|       |  2867   (2)| 00:00:01 |     1 |   256 |
-----------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   5 - filter("DD"."COL1"=1 AND "DD"."COL2"=1 AND "DD"."COL3"=0)

【问题讨论】:

  • 谓词 col1 = 1 and col2 = 1 and col3 = 0 是否如此缺乏选择性以至于不值得索引?我天真地怀疑您希望在 col1, col2, col3 上建立一个索引并在您的查询计划中使用该索引,但我不知道您的系统。

标签: oracle query-optimization oracle12c query-performance


【解决方案1】:

这些计划其实都差不多:

  • 他们都完整扫描了t_employee的所有256个分区
  • 他们都希望这会返回 54,279 行

并行运行可以使查询更快地完成。这通过在查询中投入更多资源 (CPU) 来实现。所以总的数据库时间和串行版本差不多,但是挂钟时间(可以)明显更少。

也就是说,如果计划估计准确(约 50k 行和 0.01 秒的执行时间),并行查询的开销可能会比计划 2 慢。您需要从 execution plan 获取确切的数字找出来。

我还预计第三个计划花费的时间最长,因为它有两个 hash group by 操作,而第二个计划中有一个。作为一般规则,做两次比做一次需要更长的时间。

尽管在实践中,如果行估计准确(大约 50k),您可能不会注意到差异。

另外,我如何才能找到查询的总最终成本?

查询的总成本是计划顶行(操作 0)的Cost 列中报告的值。所以它们分别是 200、3310 和 3313。

但是这个数字对您来说并没有多大用处 - 它只是优化器用来对可能的计划进行排名以选择它认为最快的计划。虽然成本较低的查询通常更快,但这并不是一个严格的规则。当然不是查询可能运行多长时间的衡量标准。

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2021-06-16
    • 1970-01-01
    • 2012-12-16
    • 2019-10-20
    相关资源
    最近更新 更多