Oracle过程需要很长时间才能运行,但是直接的sql运行得很快

时间:2015-10-13 15:20:29

标签: oracle performance stored-procedures oracle11g

我有一块sql在程序外运行得相当顺利。我将sql块放在过程中以返回ref_cursor的那一刻,该过程需要相当长的时间才能执行ref_cursor。

在DBA的帮助下,我们实施了DB配置文件,它可以很好地加速程序,但是在该特定程序中的任何微小变化都会使它变得混乱。我不确定是什么问题..我的选项用完了。我应该如何解决这个特殊的奇怪问题?

提前谢谢。

编辑..这是查询

with query_ownership as (SELECT leeo.legal_entity_id,
                           leeo.parent_le_id,
                           SUM(leeo.effective_ownership) ownership_percent
                      FROM data_ownership leeo
                     WHERE leeo.start_date <=
                           to_date('12/31/2012','mm/dd/yyyy')
                       AND ((leeo.end_date < &lvTaxYearDate and leeo.end_date > &lvTaxYearBeginDate)
                           to_date('12/31/2012','mm/dd/yyyy') OR
                           leeo.end_date IS NULL)
                       and leeo.stock_type in ('E')
                     GROUP BY leeo.legal_entity_id, leeo.parent_le_id
                    HAVING SUM(leeo.effective_ownership) > 0
),
query_branches as ( SELECT b.branch_id       as legal_entity_id,
                           b.legal_entity_id as perent_le_id,
                           1.00              as ownership_percent
                      FROM company_branches b
                     WHERE b.tax_year = 2012),
child_query as (select * from query_ownership
                    UNION
           select * from query_branches),
parent_query as (select * from query_ownership
                    UNION
           select * from query_branches),                                       
inner_query as (SELECT rownum                        as sortcode,
                   -level                        as lvl,
                   child_query.parent_le_id,
                   child_query.legal_entity_id,
                   child_query.ownership_percent
              FROM child_query
             START WITH child_query.legal_entity_id = 'AB1203'
            CONNECT BY NOCYCLE PRIOR child_query.legal_entity_id =
                        child_query.parent_le_id
                   AND child_query.ownership_percent >= 0.01
                   and level = 0
            UNION
            SELECT rownum as sortcode,
                   level - 1 as lvl,
                   parent_query.parent_le_id,
                   parent_query.legal_entity_id,
                   parent_query.ownership_percent
              FROM parent_query
             START WITH parent_query.legal_entity_id = 'AB1203'
            CONNECT BY NOCYCLE
             PRIOR parent_query.parent_le_id =
                        parent_query.legal_entity_id
                   AND parent_query.ownership_percent >= 0.01)
                  ,ownership_heirarchy as (
               SELECT max(inner_query.sortcode) as sortcode,
           max(inner_query.lvl) as lvl,
           inner_query.parent_le_id,
           inner_query.legal_entity_id,
           inner_query.ownership_percent from inner_query
     GROUP BY inner_query.parent_le_id,
              inner_query.legal_entity_id,
              inner_query.ownership_percent
              )
              ,goldList as (
SELECT lem2.legal_entity_id from ownership_heirarchy,
   company_entity_year lem1,
   company_entity_year lem2
WHERE ownership_heirarchy.parent_le_id = lem2.legal_entity_id
AND lem2.tax_year = 2012

AND ownership_heirarchy.legal_entity_id = lem1.legal_entity_id
AND lem1.tax_year = 2012
AND lem1.legal_entity_type <> 'EXT'
AND lem1.non_legal_entity_flag is null
AND lem2.legal_entity_type <> 'EXT'
AND lem2.non_legal_entity_flag is null
and TRIM(lem2.alt_tax_type) is null
and UPPER(lem2.tax_type) in ('DC', 'DPS', 'TXN')
),
fulllist as (
         select * from goldList
        union
         select gc.parent_le_id from company_entity_year e,       consolidation_group gc 
where e.LEGAL_ENTITY_ID = 'AB1203' and e.tax_year = 2012
and e.TAX_CONSOLIDATION_GRP = gc.group_id
        union
         select e.leid from vdst_entity e where e.TAX_YEAR = 2012
         and e.ALT_TAX_TYPE in (3,8)
         and e.LEID = 'AB1203'
) 

  select  distinct dc.dcn_id      as dcnId,
         dc.dcn_name    as dcnName,
         dy.dcn_year_id dcnYearId,
         ty.tax_year_id taxYearId,
         ty.tax_year    taxYear
    from company_dcn dc, company_dcn_year dy, company_tax_year ty
   where dc.dcn_id = dy.dcn_id
     and dy.year_id = ty.tax_year_id
     and ty.tax_year = 2012
     and dc.leid in (
         select * from fulllist
                     ); 

1 个答案:

答案 0 :(得分:0)

首先,通过为查询中涉及的每个表运行DBMS_STATS.GATHER_TABLE_STATS来确保统计信息是最新的。接下来,使用不同的参数值获取查询计划 - 完全有可能参数的变化可能使计划变得更好或更糟。鉴于您没有向我们展示有关查询的信息,程序和所涉及的表格无法更具体。

祝你好运。