解释计划和查询执行时间的差异



我有两个表TABLE_ATABLE_B(一对多)。(table_a在table_b中的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")

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

还可以在第12层启用10046跟踪,以检查为什么查询以不同的执行时间响应。

最新更新