当连接两个以上的表时,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/>
答案 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")
...
从右边(最嵌套)向左读取
注意 - 您的计划可能会有所不同,具体取决于您的数据和索引定义!
可以找到一些其他信息here