Oracle11g 优化查询-我在这里做了一些非常错误的事情。选择?

Oracle11g 优化查询-我在这里做了一些非常错误的事情。选择?,oracle11g,query-performance,Oracle11g,Query Performance,因此,基本上这个查询所做的是求和一些值,并从另一个包含180万条记录的表(EDTF007)中获取一些数据。EDTF011主表有大约800k条记录 那有什么问题 嗯。。。我从EDTF007获取的字段在CASE子句中有一些规则。我通过创建不同的内部联接来获取字段CCONTA,如本例所示 数据库需要1小时才能运行此查询。我运行了统计数据,创建了索引,重建了索引,尝试了直接访问分区。运行此查询大约需要1小时。目前还不能接受 问题是。。。我没有主意了。。。问题是查询的结构,因为。。。我得到的等待事件。。。

因此,基本上这个查询所做的是求和一些值,并从另一个包含180万条记录的表(EDTF007)中获取一些数据。EDTF011主表有大约800k条记录

那有什么问题

嗯。。。我从EDTF007获取的字段在CASE子句中有一些规则。我通过创建不同的内部联接来获取字段CCONTA,如本例所示

数据库需要1小时才能运行此查询。我运行了统计数据,创建了索引,重建了索引,尝试了直接访问分区。运行此查询大约需要1小时。目前还不能接受

问题是。。。我没有主意了。。。问题是查询的结构,因为。。。我得到的等待事件。。。都与此错误的查询结构相关…:

你知道我怎样才能扭转局面吗?表上的更新也太慢了,我想

WITH IMP AS (SELECT CCONTA, CREFERENCIA FROM EDTF007_IMPARIDADE  PARTITION (P_IMPARIDADE_201703))

SELECT  SUM(GC.MAVALIAA), 
V.ID, NVL(GC.CKNUMCTA, '00000000000'), NVL(GC.CKBALCAO, '0000'), GC.CKPRODUT, GC.CKSUBPRO, GC.ZDEPOSIT, GC.MSLDACT, SUM(GC.MAVALIAA), GC.TIPGARBL, GC.CGARANT, NVL(G.TIPO_GAR, 'SEM GAR'), G.TIPO_GAR2, GC.CREFERENCIA_IMP, 

 CASE
  WHEN (SUBSTR(GC.CKPRODUT, 1, 3) ) IN ('096' , '097' , '020' , '021' , '024') AND GC.CKPRODUT != 'MOR' THEN   
  (SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA) = CCONTA)

  WHEN (SUBSTR(GC.CKPRODUT, 1, 3) ) IN ('035') AND GC.CKPRODUT != 'MOR' THEN  
  (SELECT DISTINCT CCONTA FROM IMP WHERE  GC.ZDEPOSIT = CREFERENCIA)

  WHEN NVL(GC.CKBALCAO  ||GC.CKNUMCTA, '000000000000000') IN (SELECT IMP.CCONTA FROM RE_ED.EDTF007_IMPARIDADE IMP  WHERE (IMP.PRODUTO ) = ( '000' )  AND (IMP.SEGMENTO ) IN ('IE' , 'IP' , 'IA' , 'GI')) AND GC.CKPRODUT != 'MOR' THEN 
  (SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA) = CCONTA)

  WHEN SUBSTR(GC.CKPRODUT, 1, 3)  NOT IN ('096' , '097' , '020' , '021' , '024' , '035' ) AND GC.CKPRODUT != 'MOR' THEN
  (SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA || GC.CREFERENCIA_IMP) = CCONTA || CREFERENCIA)  

  WHEN GC.CKPRODUT = 'MOR'  THEN  
  (SELECT DISTINCT CCONTA FROM IMP WHERE (GC.CKBALCAO || GC.CKNUMCTA || GC.CREFERENCIA_IMP) = CCONTA || CREFERENCIA)

  ELSE '000000000000000' 
END CCONTA_IMP,
GC.CREATED_BY, GC.CREATED_DATE 

FROM RE_ED.EDTD011_GARANTIAS_CONTRATO GC,
    (SELECT MAX(IDVERSAO) AS ID FROM RE_CD.CDTD009_VERSOES WHERE (TABELA) = ('RE_CD.CDTD015_GARANTIAS_CONTRATO')) V, 
        (SELECT DISTINCT TIPO_GAR, TIPO_GAR2, CODIGO FROM RE_CD.CDTD011_COD_GARANTIAS WHERE FLAG_ATIVO = 1 AND DTBEGIN_VER <= TO_TIMESTAMP(TRUNC(TO_DATE('2017-03-01', 'YYYY-MM-DD'), 'MM')) AND DTEND_VER >= TO_TIMESTAMP(LAST_DAY(TO_DATE('2017-03-01', 'YYYY-MM-DD')))) G
WHERE (GC.ANO) = ('2017') 
            AND (GC.MES) = ('03') 
            AND (GC.CGARANT) = (G.CODIGO) 
GROUP BY V.ID, GC.CKNUMCTA, GC.CKBALCAO, GC.CKPRODUT, GC.CKSUBPRO, GC.ZDEPOSIT, GC.MSLDACT, GC.TIPGARBL, GC.CGARANT, G.TIPO_GAR, G.TIPO_GAR2, GC.CREFERENCIA_IMP, GC.CREATED_BY, GC.CREATED_DATE;

编辑:在与一位同事交谈后,他建议分离查询范围,而不是一个查询,我应该为每个案例尝试5个插入查询。我将继续采用这种方法。让我们看看进展如何。顺便说一句,主要目标是插入Select。

我很高兴您没有得到ORA-01427:单行子查询使用该case语句返回多行!如果您只希望每个select from imp返回一个cconta值,为什么不跳过distinct并将rownum=1添加到where子句中呢?您完全正确。EDTF007表有一个组合主键。如果它返回的CCONTA值超过2。。。砰。。。反正是我的错。