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。
我想首先应用 name
和 company_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 在我的情况下,这是最坏的情况。
我在甲骨文工作。
我有超过 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。
我想首先应用 name
和 company_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 在我的情况下,这是最坏的情况。