Pular para o conteúdo
  • Este tópico contém 6 respostas, 2 vozes e foi atualizado pela última vez 18 anos atrás por collins.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #78179
    collins
    Participante

      Olá,

      Tenho uma consulta grande que demora muito pra retornar o resultado e não sei como melhora-la. Se alguém puder me ajudar ficarei grato.

      o código é esse:

      Select codprod,
      coditprod,
      digitprod,
      unidade,
      qtembcomp,
      produto,
      codforne,
      fantasia,
      preco2,
      precoalterna,
      sum(totprbase) as totprbase,
      sum(qtdtotal) as qtdtotal,
      sum(vltot) as vltotal,
      sum(peso) as peso,
      0.00 PRTRANSF,
      0.00 MARKUP,
      0.00 QTDCX,
      0.00 PART,
      0.00 PRMEDIO,
      0.00 dvend,
      0.00 dmed,
      sum(OCNF) OCNF,
      sum(OCPDV) OCPDV
      From (Select ip.codprod,
      its.coditprod,
      ip.digitprod,
      prd.unidade,
      e3.qtemb as qtembcomp,
      max(nvl(prd.descricao, '') || nvl(ip.tamanho, '') ||
      nvl(cor.descres, '') || +nvl(esp.descres, '')) as produto,
      frn.codforne,
      frn.fantasia,
      max(prc.preco2) as preco2,
      max(prc.precoalterna) as precoalterna,
      sum(nvl(prc.preco2, 0) * (its.qtcomp * its.qtemb)) as totprbase,
      sum(its.qtcomp * its.qtemb) as qtdtotal,
      sum(nvl(its.vltotal, 0)) as vltot,
      sum(prd.pesoliq * its.qtcomp * its.qtemb) as peso,
      (Case
      when ms.tipoped in (0, 2) then
      count(distinct its.numnota)
      end) as OCNF,
      (Case
      when ms.tipoped in (1) then
      count(distinct its.numnota)
      end) as OCPDV
      From MOV_SAIDA ms,
      MOV_ITSAIDA its,
      CAD_PROD PRD,
      CAD_ITPROD IP,
      CAD_ESPEC ESP,
      CAD_COR COR,
      CAD_FORNE frn,
      CAD_PRECO PRC,
      CAD_FILIAL fil ,
      (Select e.codprod, e.tpemb,
      max(e.codembal) as codembal,
      max(e.qtemb) as qtemb
      From cad_embal e
      Where e.tpemb = (Select min(e2.tpemb)
      From cad_embal e2
      Where e.codprod=e2.codprod)
      Group by e.codprod, e.tpemb) e3
      Where ms.codfil = its.codfil
      and ms.tpnota = its.tpnota
      and ms.numnota = its.numnota
      and ms.serie = its.serie
      and ms.dtnota = its.dtnota
      and ms.codfil = fil.codfil
      and its.coditprod = ip.coditprod
      and ip.codprod = prd.codprod
      and prd.codforne = frn.codforne
      and ip.especific = esp.especific
      and ip.codfam = esp.codfam
      and ip.codcor = cor.codcor
      and prc.coditprod = its.coditprod
      and ip.codprod = e3.codprod
      and its.status <> 9
      and prc.codembal = 0
      and prc.codfil = 1
      and its.tpnota in (51, 133)
      and its.dtnota between '01/12/2006' and '31/12/2006'
      Group by ms.tipoped,
      ip.codprod,
      its.coditprod,
      ip.digitprod,
      prd.descricao,
      prd.unidade,
      e3.qtemb,
      frn.codforne,
      frn.fantasia)
      Group by codprod,
      coditprod,
      digitprod,
      unidade,
      qtembcomp,
      produto,
      codforne,
      fantasia,
      preco2,
      precoalterna

      #78181
      chduarte
      Participante

        Esta query parece ser um pouco complicada para te ajudar a fazer tuning ainda mais sem olhar o plano de execucao.

        Voce pode tentar colar no post o plano de acesso gerado pelo explain plan.

        []

        #78186
        collins
        Participante

          [quote=”chduarte”:2p31vefk]Esta query parece ser um pouco complicada para te ajudar a fazer tuning ainda mais sem olhar o plano de execucao.

          Voce pode tentar colar no post o plano de acesso gerado pelo explain plan.

          [][/quote]

          oi, preciso te dizer que não tenho muito conhecimento ainda de oracle e pl/sql. Se não te responder ou passar as informações corretas, tenha um pouco de paciência que aprendo rápido.

          Bom, estou te enviando uma imagem do que você me pediu. se não for isso, me avise pra mandar o correto.

          Qualquer coisa, pode falar comigo no msn ou no skype (collins.mackoy)
          SELECT STATEMENT, GOAL = CHOOSE Cost=12485 Cardinality=54 Bytes=9882
          SORT GROUP BY Cost=12485 Cardinality=54 Bytes=9882
          VIEW Object owner=GEMCO Cost=12479 Cardinality=54 Bytes=9882
          SORT GROUP BY Cost=12479 Cardinality=54 Bytes=10044
          VIEW Object owner=SYS Cost=12635 Cardinality=54 Bytes=10044
          SORT GROUP BY Cost=12473 Cardinality=54 Bytes=15552
          FILTER
          HASH JOIN Cost=12466 Cardinality=54 Bytes=15552
          NESTED LOOPS Cost=12443 Cardinality=54 Bytes=14202
          NESTED LOOPS Cost=12389 Cardinality=54 Bytes=11394
          HASH JOIN Cost=12115 Cardinality=137 Bytes=25482
          HASH JOIN Cost=12056 Cardinality=243 Bytes=41796
          HASH JOIN Cost=12051 Cardinality=243 Bytes=36693
          NESTED LOOPS Cost=12046 Cardinality=243 Bytes=31590
          HASH JOIN Cost=11803 Cardinality=243 Bytes=23328
          HASH JOIN Cost=1241 Cardinality=10647 Bytes=479115
          INDEX FULL SCAN Object owner=GEMCO Object name=CAD_FILIAL_PK Cost=1 Cardinality=62 Bytes=682
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=MOV_SAIDA Cost=1239 Cardinality=10647 Bytes=361998
          INDEX RANGE SCAN Object owner=GEMCO Object name=MOV_SAIDA_IDX_DTFILTPNOTA Cost=483 Cardinality=221
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=MOV_ITSAIDA Cost=10502 Cardinality=95976 Bytes=4894776
          INDEX RANGE SCAN Object owner=GEMCO Object name=MOV_ITSAIDA_IX01 Cost=5047 Cardinality=1
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_ITPROD Cost=1 Cardinality=1 Bytes=34
          INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_ITPROD_PK Cardinality=1
          TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_COR Cost=4 Cardinality=4437 Bytes=93177
          TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_ESPEC Cost=4 Cardinality=6933 Bytes=145593
          TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_EMBAL Cost=58 Cardinality=22168 Bytes=310352
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_PRECO Cost=2 Cardinality=1 Bytes=25
          INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_PRECO_PK Cost=1 Cardinality=1
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_PROD Cost=1 Cardinality=1 Bytes=52
          INDEX UNIQUE SCAN Object owner=GEMCO Object name=CAD_PROD_PK Cardinality=1
          TABLE ACCESS FULL Object owner=GEMCO Object name=CAD_FORNE Cost=22 Cardinality=4106 Bytes=102650
          SORT AGGREGATE Cardinality=1 Bytes=7
          TABLE ACCESS BY INDEX ROWID Object owner=GEMCO Object name=CAD_EMBAL Cost=3 Cardinality=2 Bytes=14
          INDEX RANGE SCAN Object owner=GEMCO Object name=CAD_EMBAL_PK Cost=2 Cardinality=2

          #78187
          chduarte
          Participante

            Deu para ver 3 access full na sua query CAD_FORNE, CAD_COR e CAD_ESPEC. É preciso que achar a driven table para determinar em qual criar indice e em quais colunas.

            Verifique se para estas tabelas voce tem indice nestas colunas:

            Tabela – Coluna
            CAD_FORNE – codforne, fantasia
            CAD_COR – codcor
            CAD_ESPEC – especific, codfam

            Parecem serem boas candidatas para indices.

            []

            #78272
            collins
            Participante

              [quote=”chduarte”:axkuwwm5]Deu para ver 3 access full na sua query CAD_FORNE, CAD_COR e CAD_ESPEC. É preciso que achar a driven table para determinar em qual criar indice e em quais colunas.

              Verifique se para estas tabelas voce tem indice nestas colunas:

              Tabela – Coluna
              CAD_FORNE – codforne, fantasia
              CAD_COR – codcor
              CAD_ESPEC – especific, codfam

              Parecem serem boas candidatas para indices.

              [][/quote]

              oi, precisei resolver outros assuntos e demorei um pouco. Verifiquei o que me pediu e vi que existem indices para os campos nas tabelas que você especificou.

              Obs: No caso do Fornecedor existe um indice para codforne e outro pra fantasia.

              Até tentei usar direto no código como no exemplo abaixo mas continua do mesmo jeito.
              O que mais posso fazer?
              De já agradecido pela acompanhamento.

              From MOV_SAIDA ms,
              MOV_ITSAIDA its,
              CAD_PROD PRD,
              CAD_ITPROD IP,
              /CAD_ESPEC ESP,/(Select /+ index(CAD_ESPEC_PK)/ codfam, especific, descres From cad_espec) esp,
              /CAD_COR COR,/(Select /+ index(CAD_COR_PK)/ codcor, descres From cad_cor) cor,
              /CAD_FORNE frn,/(Select /+ index(CAD_FORNE_PK)/ /+ index(CAD_FORNE_IDX_FANT)/ codforne, fantasia From cad_forne) frn,
              CAD_PRECO PRC,
              CAD_FILIAL fil ,

              #78282
              chduarte
              Participante

                A forma de colocar a hint na query é :

                Select /+ index(codfam,CAD_ESPEC_PK) */ codfam, especific, descres From cad_espec) esp,
                (Select /
                + index(codcor,CAD_COR_PK) / codcor, descres From cad_cor) cor,
                (Select /
                + index(TABELA,CAD_FORNE_PK) index(TABELA,CAD_FORNE_IDX_FANT) */

                É preciso respeitar os espacos /*+ xxx */

                Voce pode tambem fazer o seguinte. Ante de executar sua query, coloque a seguinte clausula no SQL*Plus

                SQL> alter session set optimizer_mode = rule

                Voce esta coletando estatisticas nestas tabelas?

                []

                #78413
                collins
                Participante

                  Caro amigo,
                  executei os passos que me pediu mas ainda não obtive sucesso. Resolvemos então passar para os DBA’s responsáveis (o sistema e o banco são terceirizados e só os DBA’s tem permissão para altera-los). Assim que tiver resultado eu posto aqui para informar. Assim se alguém tiver algum problema parecido já pode ser ajudado.

                  Bom, muito obrigado pela ajuda e até a próxima

                  Atenciosamente,

                  Collins Daniel

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.
                plugins premium WordPress