我有两个表TABLE_A
和TABLE_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
,以找出它发生的原因。
查询解释计划,对于上述所有查询,它打印出相同的cost
和time
,没有任何差异。(解释下面的计划)我重新运行了几次,但结果是相同的所有上述查询。
问题:为什么当解释计划显示所有查询花费相同的时间时,结果的速度会发生变化?我哪里做错了?
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跟踪,以检查为什么查询以不同的执行时间响应。