【问题标题】:Explain plan and Query execution time differences解释计划和查询执行时间的差异
【发布时间】:2014-10-14 05:22:24
【问题描述】:

我有两个表 TABLE_ATABLE_B(一对多。table_b 中的 table_a 的 FK)。我已经编写了以下 3 个查询,每个查询都会在表上以不同的速度执行,但基本上它们都在做同样的事情。

时间: 3.916 秒。

SELECT count(*)
FROM TABLE_A hconn
WHERE EXISTS
  (SELECT *
  FROM TABLE_B hipconn
  WHERE HIPCONN.A_ID = HCONN.A_ID
  );

时间:3.52秒

 SELECT COUNT(*)
FROM TABLE_A hconn,
  TABLE_B HIPCONN
WHERE HCONN.A_ID = HIPCONN.A_ID;

时间:2.72 秒。

 SELECT COUNT(*)
FROM TABLE_A HCONN
JOIN TABLE_B HIPCONN
ON HCONN.A_ID = HIPCONN.A_ID;

从上面的时间,我们可以知道最后一个查询比其他查询执行得更好。 (我已经对它们进行了多次测试,它们都按照提到的相同顺序执行,但最后一个查询始终执行良好)。

我已经开始查看explain plan 以了解上述查询的原因。

查询解释计划,它为上述所有查询打印出相同的costtime,没有任何区别。(解释计划如下)我重新运行了几次,但所有的结果都是相同的以上查询。

问题:为什么当解释计划显示所有查询都需要相同的时间时,结果的速度会有所不同?我哪里错了?

Plan hash value: 600428245

-------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                           | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                                |     1 |    11 |       | 12913   (2)| 00:02:35 |
|   1 |  SORT AGGREGATE                |                                |     1 |    11 |       |            |          |
|*  2 |   HASH JOIN RIGHT SEMI         |                                |  2273K|    23M|    39M| 12913   (2)| 00:02:35 |
|   3 |    INDEX STORAGE FAST FULL SCAN| BIN$ACCkNNuTHKPgUJAKNJgj5Q==$0 |  2278K|    13M|       |  1685   (2)| 00:00:21 |
|   4 |    INDEX STORAGE FAST FULL SCAN| BIN$ACCkNNubHKPgUJAKNJgj5Q==$0 |  6448K|    30M|       |  4009   (2)| 00:00:49 |
-------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("HIPCONN"."A_ID"="HCONN"."A_ID")

【问题讨论】:

  • 您是否更改了查询执行的顺序?假设所有查询以相同的 OPTIMIZER_MODE 值运行并且未使用大纲,我将为每个查询识别 sql_id 并检查 v$sqlv$sqlarea 中的内容(我预计一个或多个 ** 的差异*_wait_time 列)
  • @a1ex07 我不确定数据库使用的是什么优化器模式。我可能需要访问才能知道这一点,现在到达这里很麻烦:(
  • 如果您执行其中任何一个查询并执行 3 次会发生什么?
  • @mustaccio 我跑了第三次 3 次,它给出了 3.51、3.21、3.20。你期待有什么不同吗?
  • @Zeus : 签入v$sql - 它有 optimizer_mode 列。

标签: sql oracle oracle10g sql-execution-plan


【解决方案1】:

您可以使用DBMS_XPLAN.DISPLAY_CURSOR 显示最后执行的 SQL 语句的实际执行计划,因为查询在库缓存中可能有多个执行计划。

您还可以在级别 12 启用 10046 跟踪,以检查查询以不同执行时间响应的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2014-10-19
    • 2012-05-21
    • 1970-01-01
    • 2016-11-21
    • 2013-04-15
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多