【发布时间】:2014-10-14 05:22:24
【问题描述】:
我有两个表 TABLE_A 和 TABLE_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 以了解上述查询的原因。
查询解释计划,它为上述所有查询打印出相同的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")
【问题讨论】:
-
您是否更改了查询执行的顺序?假设所有查询以相同的 OPTIMIZER_MODE 值运行并且未使用大纲,我将为每个查询识别 sql_id 并检查
v$sql和v$sqlarea中的内容(我预计一个或多个 ** 的差异*_wait_time 列) -
@a1ex07 我不确定数据库使用的是什么优化器模式。我可能需要访问才能知道这一点,现在到达这里很麻烦:(
-
如果您执行其中任何一个查询并执行 3 次会发生什么?
-
@mustaccio 我跑了第三次 3 次,它给出了 3.51、3.21、3.20。你期待有什么不同吗?
-
@Zeus : 签入
v$sql- 它有 optimizer_mode 列。
标签: sql oracle oracle10g sql-execution-plan