优化查询 - 我在这里做了一些非常错误的事情。替代方案?

时间:2017-05-10 09:13:36

标签: oracle11g query-performance

所以基本上这个查询的作用是SUM一些值,并从另一个表中获取一些数据(有180万条记录 - EDTF007 - WITH中的一条)。 EDTF011(主表)有大约800k的记录。

那么问题是什么?

嗯......我从EDTF007获取的字段有一些规则(见CASE子句)。我通过制作不同的“INNER JOINS”来获取CCONTA字段(如CASE中所示)。

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

事情是......我没有想法......问题是查询的结构,因为......我得到的WAIT事件......都与这个错误的查询结构有关。 。:(

任何想法我怎么能扭转这个?我认为桌子上的更新速度太慢了......

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;
编辑:在与同事进行一些对话之后,他会将查询范围分开,而不是1个查询,我应该尝试对每个案例进行5次插入查询。我正在采用这种方法。让我们看看它是怎么回事。主要目标是顺便插入Select。

0 个答案:

没有答案