阅读Oracle解释计划

swe*_*wet 5 sql oracle performance oracle11g

explain plan for 
    SELECT * FROM schema2.mv_a_data mv
      WHERE mv.routing_code_type_id    = 3
      AND mv.static_data_status_id    IN(5, 8)
      AND mv.acct_currency_ind_id NOT IN
         (SELECT DISTINCT te.acct_currency_ind_id 
          FROM schema1.tem_ele te 
          WHERE te.lis_tem_id IN      
                  (SELECT lis_tem_id 
                   FROM schema1.lis_tem 
                   WHERE lis_tem.template_type_id = 2
                   AND lis_tem.deleted_flag       = 'N'      )
      AND te.acct_currency_ind_id IS NOT NULL
    )
 ORDER BY mv.treasury_region_code, 
          mv.legal_entity_mnemonic, 
          mv.currency_code;

 select * 
 from TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', null,'ADVANCED'));
Run Code Online (Sandbox Code Playgroud)
explain plan for 
    SELECT * FROM schema2.mv_a_data mv
      WHERE mv.routing_code_type_id    = 3
      AND mv.static_data_status_id    IN(5, 8)
      AND mv.acct_currency_ind_id NOT IN
         (SELECT DISTINCT te.acct_currency_ind_id 
          FROM schema1.tem_ele te 
          WHERE te.lis_tem_id IN      
                  (SELECT lis_tem_id 
                   FROM schema1.lis_tem 
                   WHERE lis_tem.template_type_id = 2
                   AND lis_tem.deleted_flag       = 'N'      )
      AND te.acct_currency_ind_id IS NOT NULL
    )
 ORDER BY mv.treasury_region_code, 
          mv.legal_entity_mnemonic, 
          mv.currency_code;

 select * 
 from TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE', null,'ADVANCED'));
Run Code Online (Sandbox Code Playgroud)

我正在尝试阅读给定的解释计划。看了解释计划后,根据我的理解,首先对LIS_TEM表和TEM_ELE进行FTS,然后使用HASH JOIN进行连接。

问题 1 - 我可以将此 HASH JOIN 更改为 NESTED LOOP 吗?

我问只是为了学习目的。我知道 HASH JOIN 在这里很好。HASH JOIN之后,我猜它会转到ID3,即VIEW VW_NSO_1和ID7 MAT_VIEW。

问题 2 - 这个 VIEW VW_NSO_1 是什么,SQL 查询的哪个子句负责将它带到这里?
问题 3 - 我将如何阅读该计划的其余部分?
问题 4 - 为什么要使用 HASH JOIN RIGHT ANTI?

请帮助我详细理解上述解释计划。谢谢,如果您需要更多详细信息,请告诉我。

dba*_*jtr 0

您可以使用查询提示“强制”查询使用特定的联接,尽管我不推荐这样做。如果它使用哈希,那么它可能是最好的选择。如果您认为使用不同的联接会更好,请确保您的统计信息是最新的

Oracle 文档有助于查看每个操作正在执行的操作: https://docs.oracle.com/cd/B10501_01/server.920/a96533/ex_plan.htm