Melhorar Performance usando Left Join

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

E aí pessoal, tudo bem?
Tenho um select que está usando a cláusula WHERE NOT EXISTS e está demorando muito para trazer os dados.
Gostaria de saber como implementar LEFT JOIN neste caso específico, para diminuir o tempo que ele leva para trazer os valores.

Selecionar tudo

select     A.MKT_DATA_AGGR_CODE                        COD_AGRUPADOR
         , H.MKT_DATA_ATRIB_CODE                       COD_ATRIBUTO
         , F.MKT_DATA_BUS_AGGR_CODE                      COD_GRP_MONITOR
         , B.MKT_DATA_AGGR_NAME                        NOME_AGRUPADOR
         , C.RATE_SOURCE_NAME                          NOME_FONTE_DESTINO
         , I.MKT_DATA_ATRIB_NAME                       NOME_ATRIBUTO
         , G.MKT_DATA_BUS_AGGR_NAME                      NOME_GRP_MONITOR
      from DATA_MARKET           A
         , AGGR_DATA_MARKET      B
         , SOURCE_RATE           C
         , ASSOC_AGGR_DATA_MKT F
         , AGGR_BUS_DATA_MARKET    G
         , ASSOC_DATA_MKT_ATRIB  H
         , ATRIB_DATA_MARKET     I
     where A.MKT_DATA_AGGR_CODE       = B.MKT_DATA_AGGR_CODE
       and A.RATE_SOURCE_CODE         = B.RATE_SOURCE_CODE
       and A.ACTV_MKT_DATA_IND        = 'S'
       and A.RATE_SOURCE_CODE         = C.RATE_SOURCE_CODE

       and not exists  (select 'x'from ATRIB_DATA_MKT_IMP J
                                     , LOG_INTER          K
                                     , DATA_MARKET_IMP    L
                                 where J.LOG_ID                = K.LOG_ID
                                   and H.MKT_DATA_AGGR_CODE    = J.MKT_DATA_AGGR_CODE
                                   and H.RATE_SOURCE_CODE      = J.RATE_SOURCE_CODE
                                   and H.MKT_DATA_CODE         = J.MKT_DATA_CODE
                                   and H.MKT_DATA_ATRIB_CODE   = J.MKT_DATA_ATRIB_CODE
                                   and L.MKT_DATA_AGGR_CODE    = J.MKT_DATA_AGGR_CODE
                                   and L.RATE_SOURCE_CODE      = J.RATE_SOURCE_CODE
                                   and L.MKT_DATA_CODE         = J.MKT_DATA_CODE
                                   and L.LOG_ID                = J.LOG_ID
                       )
  
     group by A.MKT_DATA_AGGR_CODE
            , A.RATE_SOURCE_CODE
            , A.MKT_DATA_CODE
            , H.MKT_DATA_ATRIB_CODE
            , F.MKT_DATA_BUS_AGGR_CODE
            , B.MKT_DATA_AGGR_NAME
            , C.RATE_SOURCE_NAME
            , nvl(A.MKT_DATA_LABEL_TEXT, A.MKT_DATA_NAME)
            , I.MKT_DATA_ATRIB_NAME
            , G.MKT_DATA_BUS_AGGR_NAME
            , G.SG_FUNC_GROUP_NAME
            , A.ARRVL_PRELMNRY_TIME
            , A.MKT_DATA_CMNT_TEXT

Alguém tem alguma idéia?
Avatar do usuário
Toad
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 253
Registrado em: Sex, 18 Nov 2005 2:14 pm
Localização: Seattle, WA
Contato:
Matheus Gonçalves
matheus.dev
twitter.com/developer__c

Consegui aqui algo que me troxe os mesmos dados em 2,3s ao invés de 34,953:

Selecionar tudo


select  A.MKT_DATA_AGGR_CODE                     COD_AGRUPADOR
         , H.MKT_DATA_ATRIB_CODE                       COD_ATRIBUTO
         , F.MKT_DATA_BUS_AGGR_CODE                    COD_GRP_MONITOR
         , B.MKT_DATA_AGGR_NAME                        NOME_AGRUPADOR
         , C.RATE_SOURCE_NAME                          NOME_FONTE_DESTINO
         , I.MKT_DATA_ATRIB_NAME                       NOME_ATRIBUTO
         , G.MKT_DATA_BUS_AGGR_NAME                    NOME_GRP_MONITOR
      from DATA_MARKET           A
         , AGGR_DATA_MARKET      B
         , SOURCE_RATE           C
         , ASSOC_AGGR_DATA_MKT F
         , AGGR_BUS_DATA_MARKET    G
         , ASSOC_DATA_MKT_ATRIB  H
         , ATRIB_DATA_MARKET     I
         
         -- ADICIONEI AS DUAS TABELAS
         , ATRIB_DATA_MKT_IMP J
         , MOV_ATRIB_DATA_MKT_IMP M

     where A.MKT_DATA_AGGR_CODE       = B.MKT_DATA_AGGR_CODE
       and A.RATE_SOURCE_CODE         = B.RATE_SOURCE_CODE
       and A.ACTV_MKT_DATA_IND        = 'S'
       and A.RATE_SOURCE_CODE         = C.RATE_SOURCE_CODE


       -- AS ALTERAÇÕES FORAM FEITAS AQUI:

       AND M.MKT_DATA_AGGR_CODE    (+)= H.MKT_DATA_AGGR_CODE
       AND M.RATE_SOURCE_CODE      (+)= H.RATE_SOURCE_CODE
       AND M.MKT_DATA_CODE         (+)= H.MKT_DATA_CODE
       AND M.MKT_DATA_ATRIB_CODE   (+)= H.MKT_DATA_ATRIB_CODE

       AND NOT EXISTS  (select X.MKT_DATA_AGGR_CODE
                                     from  LOG_INTER          K
                                         , DATA_MARKET_IMP    L
                                         , ATRIB_DATA_MKT_IMP X
                                     where X.LOG_ID              = K.LOG_ID
                                     and L.MKT_DATA_AGGR_CODE    = X.MKT_DATA_AGGR_CODE
                                     and L.RATE_SOURCE_CODE      = X.RATE_SOURCE_CODE
                                     and L.MKT_DATA_CODE         = X.MKT_DATA_CODE
                                     and L.LOG_ID                = X.LOG_ID
                                     AND X.MKT_DATA_AGGR_CODE    = J.MKT_DATA_AGGR_CODE
                        ) 
=]
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 19 visitantes