我在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进行全表扫描。
我想首先应用name
和company_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';
即使在应用此更改后,我发现在某些数据库环境中,两个查询的执行计划相同。
有没有什么方法可以在查询执行时订购执行计划的步骤,比如明确指定内连接的顺序?
由于
答案 0 :(得分:2)
如果你真的想要它,你可以使用优化器提示:https://docs.oracle.com/cd/B12037_01/server.101/b10752/hintsref.htm#5555
但通常我不推荐它 - 如果表统计信息是最新的,数据库应该能够确定最佳执行计划(特别是对于这样一个简单的查询)。
答案 1 :(得分:1)