代码之家  ›  专栏  ›  技术社区  ›  akash777.sharma

根据where子句Oracle对查询中的多个内部联接进行排序以提高性能

  •  0
  • akash777.sharma  · 技术社区  · 8 年前

    我在甲骨文公司工作。

    我有两个以上的表来执行内部联接。据我所知,它们的排序对查询性能至关重要。

    以下是查询:

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

    我想应用谓词过滤器 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';
    

    在查询执行时,有没有什么方法可以对执行计划的步骤进行排序,比如显式指定内部联接的排序?

    谢谢

    2 回复  |  直到 8 年前
        1
  •  2
  •   sers    8 年前

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

        2
  •  1
  •   akash777.sharma    8 年前

    谢谢@sers

    我还发现了使用 /*+ORDERED */ 早于您提供的解决方案。但我只是想要一些提高性能的证据。

    所以我刚刚执行了

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

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

    enter image description here

    我知道甲骨文可以找到最好的计划,但强制执行计划帮助我提高了性能。同样在我的情况下,这是最坏的情况。