在查询中对多个内部联接进行排序,以便在Oracle子句的基础上提高性能

时间:2016-08-22 12:54:36

标签: oracle inner-join database-performance

我在oracle工作。

我有两个以上的表来执行内连接。据我所知,他们的排序对查询性能很重要。

以下是查询:

select * from 
 FROM A a 
INNER JOIN B b
ON a.b_ID=b.id
INNER JOIN C c
ON c.id=a.c_Id
INNER JOIN D d
ON a.d_ID=d.id
INNER JOIN E e
ON e.d_id =d.id
where e.name='abc' AND e.company_name='xyz';

就我而言,我不需要对表A,B,C,D进行全表扫描。

我想首先应用namecompany_name的谓词过滤器,然后应用表A,B,C,D的内连接(在执行计划中)。

我的问题是:这可能吗?

另外,如果我在final where子句的基础上改变内连接的顺序,那可以提高性能(如下面的查询)吗?

select * from 
E e INNER JOIN D d
ON e.d_id =d.id
INNER JOIN A a
ON a.d_ID=d.id
INNER JOIN B b
ON a.b_ID=b.id
INNER JOIN C c
ON c.id=a.c_Id
where e.name='abc' AND e.company_name='xyz';

即使在应用此更改后,我发现在某些数据库环境中,两个查询的执行计划相同。

有没有什么方法可以在查询执行时订购执行计划的步骤,比如明确指定内连接的顺序?

由于

2 个答案:

答案 0 :(得分:2)

如果你真的想要它,你可以使用优化器提示:https://docs.oracle.com/cd/B12037_01/server.101/b10752/hintsref.htm#5555

但通常我不推荐它 - 如果表统计信息是最新的,数据库应该能够确定最佳执行计划(特别是对于这样一个简单的查询)。

答案 1 :(得分:1)

谢谢@sers

我还发现这个解决方案比你提供的解决方案更早使用/*+ORDERED */。但我只想要一些提高性能的证明。

所以我刚刚执行了

explain plan for sql_query;
select plan_table_output from table(dbms_xplan.display('plan_table',null,'typical')); 

我无法显示实际的表输出(因此省略表名),但我会在此处发布其他性能因素:

enter image description here

我知道oracle可以找出最好的计划,但强制执行计划帮助我提高了性能。在我的情况下,这是最糟糕的情况。