【问题标题】:Oracle performance TuningOracle 性能调优
【发布时间】:2016-06-25 11:27:57
【问题描述】:

我有以下 oracle 查询。运行需要很长时间。您能否建议对此查询进行一些性能调整。

select ss.registration_id as REGISTRATION_ID,
       ss.batch_id as BATCH_ID
  from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss,
       (select a.exceptn_criteria_val,
               a.exceptn_criteria_rtrn_val 
          from EXCEPTN_CRITERIA a,
               EXCEPTN_EXPRESSION b
          where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
            and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
            and b.IS_CURRENT_INDCTR = 1
            and a.IS_CURRENT_INDCTR = 1) sub_query
  where ss.REVENUE_CD = sub_query.exceptn_criteria_val
    and ss.batch_id =  821370
    and exists (select 'x'
                  from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss2,
                       (select a.exceptn_criteria_val,
                               a.exceptn_criteria_rtrn_val 
                          from EXCEPTN_CRITERIA a,
                               EXCEPTN_EXPRESSION b
                          where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
                            and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
                            and b.IS_CURRENT_INDCTR = 1
                            and a.IS_CURRENT_INDCTR = 1) sub_query2
                  where ss2.REVENUE_CD = sub_query2.exceptn_criteria_val
                    and ss2.registration_id = ss.registration_id
                    and ss2.batch_id = ss.batch_id
                    and ss2.batch_id = 821370
                    and sub_query2.exceptn_criteria_rtrn_val <> sub_query.exceptn_criteria_rtrn_val)
  Order By Ss.Registration_Id,
           ss.batch_id;

【问题讨论】:

  • 如果你能发布你的解释计划以及你的表和索引的结构将会很有用
  • 我个人会去掉exists 子句并使用join。在我的情况下,它工作得更快。除此之外,请查看说明计划并找到您在哪里进行全表扫描。如果可能的话,在它们上创建索引。
  • 发布查询通常没有足够的信息; here你可能会发现一些你应该发布的提示。

标签: oracle performance oracle11g


【解决方案1】:

如果我理解正确,您可以使用相关子查询来查找具有多个不同 exceptn_criteria_rtrn_val 值的行。如果我是对的,最好使用解析函数:

select vw.registration_id as REGISTRATION_ID, vw.batch_id as BATCH_ID
from
 (select ss.registration_id as REGISTRATION_ID, ss.batch_id as BATCH_ID
        ,count(distinct sub_query.exceptn_criteria_rtrn_val) over(partition by ss.registration_id, ss.batch_id) as cnt
    from submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss,
         (select a.exceptn_criteria_val, a.exceptn_criteria_rtrn_val
            from EXCEPTN_CRITERIA a, EXCEPTN_EXPRESSION b
           where a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID
             and b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
             and b.IS_CURRENT_INDCTR = 1
             and a.IS_CURRENT_INDCTR = 1) sub_query
   where ss.REVENUE_CD = sub_query.exceptn_criteria_val
     and ss.batch_id = 821370) vw
where cnt > 1
Order By vw.Registration_Id, vw.batch_id;

【讨论】:

    【解决方案2】:

    您可以将EXISTS 替换为GROUP BYHAVING

    SELECT ss.registration_id,
           ss.batch_id
    FROM   submtd_srvc PARTITION(SUBMTD_SRVC_821370) ss
           INNER JOIN
           EXCEPTN_CRITERIA a
           ON ( ss.REVENUE_CD = a.exceptn_criteria_val )
           INNER JOIN
           EXCEPTN_EXPRESSION b
           ON ( a.EXCEPTN_EXPRESSION_ID = b.EXCEPTN_EXPRESSION_ID )
    WHERE  b.EXCEPTN_EXPRESSION_NAME = 'NC_CUSTOM_REV_CAT'
    AND    b.IS_CURRENT_INDCTR = 1
    AND    a.IS_CURRENT_INDCTR = 1
    AND    ss.batch_id =  821370
    GROUP BY
           ss.Registration_Id,
           ss.batch_id
    HAVING COUNT( DISTINCT a.exceptn_criteria_rtrn_val ) = 1
    ORDER BY
           ss.Registration_Id,
           ss.batch_id;
    

    我还去掉了所有子查询,并使用 ANSI 标准联接而不是旧的 Oracle 联接。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多