【问题标题】:How to tune self join query in oracle 11g如何在 oracle 11g 中调整自联接查询
【发布时间】:2013-06-01 07:38:07
【问题描述】:

Oracle 和 SQL 对我来说是新手,我仍处于学习阶段。

你能帮我调整下面的 oracle 查询吗? 此表包含约 95 条 lac 记录,使用此查询检索数据需要 1 小时。

您的建议/cmets/帮助将不胜感激。

提前致谢。

    SELECT A.CNO   AS CNO,
       A.FNO AS FNO,
       A.CID AS CID,
       A.IID             AS IID
  FROM CAC_LKP A,
       (SELECT C_DATE, CNO, FNO
          FROM (SELECT MAX(CAC_LKP.C_DATE) AS C_DATE,
                       CAC_LKP.CNO AS CNO,
                       CAC_LKP.FNO AS FNO
                  FROM CAC_LKP
                 WHERE ACTIVE = 'Y'
                 GROUP BY CNO, FNO)) B
 WHERE A.C_DATE = B.C_DATE
   AND A.CNO = B.CNO
   AND A.FNO = B.FNO
   AND A.ACTIVE = 'Y'

主键是通过 c_date、iid、active 的组合定义的。

【问题讨论】:

  • 您的表上有哪些索引?

标签: sql oracle11g self-join


【解决方案1】:

您正在使用聚合来获取变量组的最新日期。然后,您将获得与这些日期匹配的行。

要优化查询,请忘记自联接并改用分析函数:

select cno, fno, cid, lid
from (select A.*,
             rank() over (partition by cno, fno order by c_date desc) as seqnum
      from cac_lkp A
      where A.active = 'Y'
     ) A
where seqnum = 1;

【讨论】:

  • 哇..太棒了..看起来很有希望..会试试这个,让您知道性能的改进..感谢您的快速帮助..:)
【解决方案2】:

由于数据量很大,去除不必要的子查询可以提高性能。确保您在 C_DATE、CNO、FNO 和 A.ACTIVE 上有索引。试试这个sql

SELECT A.CNO   AS CNO,
       A.FNO AS FNO,
       A.CID AS CID,
       A.IID             AS IID
  FROM CAC_LKP A,
       (SELECT MAX(CAC_LKP.C_DATE) AS C_DATE,
                       CAC_LKP.CNO AS CNO,
                       CAC_LKP.FNO AS FNO
                  FROM CAC_LKP
                 WHERE ACTIVE = 'Y'
                 GROUP BY CNO, FNO) B
 WHERE A.C_DATE = B.C_DATE
   AND A.CNO = B.CNO
   AND A.FNO = B.FNO
   AND A.ACTIVE = 'Y'

【讨论】:

  • 感谢 Ankur,我尝试过使用索引,但没有看到这样的改进。:(
  • @ParthSavjani :请在尝试查询后发布您的结果。上述查询或 Gordon 的查询是否缩短了您的响应时间?
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多