需要帮助来优化 ORACLE SQL 查询 [关闭]

Posted

技术标签:

【中文标题】需要帮助来优化 ORACLE SQL 查询 [关闭]【英文标题】:need a help to optimize ORACLE SQL query [closed] 【发布时间】:2019-08-13 13:01:28 【问题描述】:

有人可以帮我优化以下查询吗?

此查询从 JOINS 中描述的许多表中获取记录,由于以下联接,它花费了太多时间:

如下所示,我花费了太多时间来执行这两个连接。 有什么方法可以让我更好地实施吗?

 SELECT......... .....
 LEFT OUTER JOIN .....
 LEFT OUTER JOIN
      (
       SELECT DISTINCT A,B,C
       from ABC
       where (A,B,C )  not in 
       (
       select A,B,C from 
              ( 
                  SELECT A,B,C,count(*) 
                  FROM ABC
                  group by  A,B,C                 
                  having count(*) >1 
              )
       ) 
     )      temp1       ON condition1
LEFT OUTER JOIN
      (
       SELECT DISTINCT X,Y,Z      from XYZ
       where (X,Y,Z  )  not in 
       (
       select X,Y,Z  from 
              ( 
                  SELECT X,Y,Z ,count(*) 
                  FROM XYZ
                  group by  X,Y,Z                  
                  having count(*) >1 
              )
       ) 
     )      temp2       ON condition2 .... ... LEFT OUTER JOIN ....... Where 

一些条件

如果我删除上面显示的两个连接,查询会顺利进行。

【问题讨论】:

不需要distinct,因为之前的count 消除了重复项。您可以将这些子查询更改为analytic versions。 【参考方案1】:

如果您确定上述代码块会对性能产生影响,那么您可以使用以下代码。我已经用我的版本替换了你的内部查询。 -- 见内联 cmets。

SELECT......... .....
 LEFT OUTER JOIN .....
 LEFT OUTER JOIN
--      (
--       SELECT DISTINCT A,B,C
--       from ABC
--       where (A,B,C )  not in 
--       (
--       select A,B,C from 
--              ( 
--                  SELECT A,B,C,count(*) 
--                  FROM ABC
--                  group by  A,B,C                 
--                  having count(*) >1 
--              )
--       ) 
--     )      
                --
                -- commented above inner query and 
                --
                -- added following inner query
                --
                (SELECT A,B,C 
                  FROM ABC
                  group by  A,B,C                 
                  having count(*) = 1)
                --
                --
     temp1       ON condition1
LEFT OUTER JOIN
--      (
--       SELECT DISTINCT X,Y,Z      from XYZ
--       where (X,Y,Z  )  not in 
--       (
--       select X,Y,Z  from 
--              ( 
--                  SELECT X,Y,Z ,count(*) 
--                  FROM XYZ
--                  group by  X,Y,Z                  
--                  having count(*) >1 
--              )
--       ) 
--     )      
                --
                -- commented above inner query and 
                --
                -- added following inner query
                --
                (SELECT X,Y,Z
                  FROM XYZ
                  group by  X,Y,Z                  
                  having count(*) = 1 )
                --
                --
     temp2       ON condition2 .... ... LEFT OUTER JOIN ....... Where 

干杯!!

【讨论】:

我已经用一个更简单的版本解决了 OP 的冗长查询,这将节省执行时间 -- @Rob 这里的问题是题外话,不应该回答。并非所有问题都应回答:***.com/help/how-to-answer 该问题现已关闭,将与您的回答一起被删除。 是的,我能理解。

以上是关于需要帮助来优化 ORACLE SQL 查询 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

请帮助优化查询

关于优化在大量数据上执行的 Oracle SQL 查询的建议/技巧

使用 NOT IN(Oracle Sql Developer)的查询性能优化

需要帮助在 12c 中优化 Oracle 查询

如何优化使用游标的 PL/SQL 代码

我怎样才能优化视图oracle sql