【问题标题】:Rewrite SQL for best performance (oracle) [closed]重写 SQL 以获得最佳性能(oracle)[关闭]
【发布时间】:2019-11-24 18:31:10
【问题描述】:

我们想知道最好的方法是重写以下 SQL 以使其在 Oracle 数据库中执行得更好。

如您所见,查询是根据基于键的数据从两个表(Period 和 Account)中过滤出来的。我相信这可以很好地调整,可能将<> 替换为!= 会带来任何好处等。

SELECT 
    p.key, p.period 
FROM 
    Period p 
WHERE
    p.version = 0 
    AND p.balance <> 0 
    AND EXISTS (SELECT 1 
                FROM Period p2 
                WHERE p2.jointKey <> 0 
                  AND p.key = p2.jointKey 
                  AND p.period = p2.period 
                  AND EXISTS (SELECT 1 FROM Account a 
                              WHERE a.customerKey = :B1 AND a.key = p.jointKey) );

【问题讨论】:

  • 定义得更好,你得到了什么性能?你想要什么样的表现?
  • 请阅读this excellent explanation,了解如何在此站点上询问 Oracle 调优问题。它不仅会向您显示我们回答此类问题所需的信息,还可能为您提供自己调查此问题所需的指导。

标签: sql oracle performance query-optimization oracle12c


【解决方案1】:

其中一个重写将如下所示

SELECT p1.key, p1.period 
FROM Period p1 
join Period p2 on p1.key = p2.jointKey AND p1.period = p2.period and p2.jointKey <> 0
join Account a on a.key = p.jointKey
WHERE p.version = 0
and a.customerKey = :B1

【讨论】:

    【解决方案2】:

    请验证表的索引并查询决定分开。

    (SELECT 1 FROM Account a WHERE a.customerKey = :B1 AND a.key = p.jointKey)
    
    (SELECT 1 FROM Period p2 WHERE p2.jointKey <> 0 AND p.key = p2.jointKey AND p.period = p2.period AND EXISTS  );
    
    
    SELECT p.key, p.period FROM Period p WHERE p.version = 0 AND p.balance <> 0 AND EXISTS 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多