Oracle基于where子句对查询中的多个inner join进行排序以提高性能

Ordering of multiple inner joins in a query to improve performance on the basis of where clause Oracle

我在甲骨文工作。

我有超过 2 tables 来执行内部连接。根据我的说法,他们的排序对查询性能很重要。

下面是查询:

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';

在我的例子中,我不需要完整 table 扫描 tables A、B、C、D。

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

我的问题是:这可能吗?

此外,如果我在最终 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';

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

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

谢谢

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

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

感谢@sers

我还发现这个使用 /*+ORDERED */ 的解决方案比你 provided.But 的解决方案更早,我只是想要一些性能提升的证据。

所以我刚刚执行了

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

我无法显示实际的 table 输出(因此省略 table 名称),但我会 post 其他性能因素在这里 :

我知道 oracle 可以找出最佳计划,但是强制执行计划帮助我改进了 performance.Also 在我的情况下,这是最坏的情况。