如何连接查询执行

时间:2016-02-10 15:49:38

标签: sql oracle oracle11g oracle10g

当连接两个以上的表时,oracle数据库如何确定连接查询的执行顺序。

我列出了除了像TableA上的col1A,col1B这样的复合索引之外没有任何约束的3个表。

现在告诉我查询运行的顺序是什么?
并有更快的运行查询的替代解决方案?

表:

TableA <br/>
_______ <br/>
col1A ====> composite Index Column | col2A ====> composite Index Column | col3A | col4A 
----------------------------------------------------------------------------------------



TableB
____________
col1B |  col2B  |  col3B  |  col4B 
-------------------------------------


TableC
___________ 
col1c |  col2c  |  col3c  |  col4c
-------------------------------------

查询:

SELECT col1c FROM TableA a,TableB b,TableC c 
WHERE a.col1A = b.col1B <br/>
AND b.col1B=c.col1C <br/>
AND a.col2A=b.col2B <br/>

1 个答案:

答案 0 :(得分:1)

检查查询的第一件事是预先形成EXPLAIN PLAN

您可以在其中看到使用了什么(if)索引以及处理表的顺序。

简单示例

EXPLAIN PLAN  SET STATEMENT_ID = 'jara1' into   plan_table  FOR
select col1c from TableA a,TableB b,TableC c 
where a.col1A = b.col1B
and b.col1B=c.col1C
and a.col2A=b.col2B 



 SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', 'jara1','ALL'));

返回

Plan hash value: 2882163091

------------------------------------------------------------------------------
| Id  | Operation           | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |        |  1000 | 65000 |    80   (3)| 00:00:01 |
|*  1 |  HASH JOIN          |        |  1000 | 65000 |    80   (3)| 00:00:01 |
|*  2 |   HASH JOIN         |        |  1000 | 52000 |    11  (10)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| TABLEB |  1000 | 26000 |     3   (0)| 00:00:01 |
|   4 |    TABLE ACCESS FULL| TABLEA | 10000 |   253K|     7   (0)| 00:00:01 |
|   5 |   TABLE ACCESS FULL | TABLEC |   110K|  1401K|    69   (2)| 00:00:01 |
------------------------------------------------------------------------------
...

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

   1 - access("B"."COL1B"="C"."COL1C")
   2 - access("A"."COL1A"="B"."COL1B" AND "A"."COL2A"="B"."COL2B")

...

从右边(最嵌套)向左读取

  • 首先表A和B是HASH连接(没有索引)
  • 在第二步中,结果与表C老化与HASH连接相结合。

注意 - 您的计划可能会有所不同,具体取决于您的数据和索引定义!

可以找到一些其他信息here