Pular para o conteúdo
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #106062
    Avatar de mpunganmpungan
    Participante

      Pessoal, se alguém puder ajudar no ajuste desse script.

      SELECT DISTINCT PC.IDPROTOCOLOCALIBRACAO,
      CASE WHEN (SELECT COUNT(S.IDSIGNATARIODEPARTAMENTO)
      FROM SGL.GL_SIGNATARIODEPARTAMENTO S
      WHERE S.IDCOLABORADOR = 1 AND S.IDDEPARTAMENTO = D.IDDEPARTAMENTO) > 0 THEN ‘S’ ELSE ‘N’ END AS SIGNATARIO,
      PC.CDPROTOCOLO,
      PC.NUMSEQITEM,
      PC.IDITEMCALIBRACAO,
      IC.VLUNITARIO * (1+((NVL(IC.PCACRESCIMO,0)-NVL(IC.PCDESCONTO,0))/100)) AS VLUNITARIO,
      SGL.GL_F_UPP_TO_REAL(IC.VLUNITARIO * (1+((NVL(IC.PCACRESCIMO,0)-NVL(IC.PCDESCONTO,0))/100)), O.DTGERACAO) AS VLUNITARIOREAIS,
      PC.IDENTREGA,
      PC.IDEQUIPAMENTOCLIENTE,
      PC.DHABERTURA,
      PC.DHDISPCALIBRACAO,
      PC.DHFIMCALIBRACAO,
      PC.NRCERTIFICADO,
      PC.DTCERTIFICADO,
      PC.DHDISPENVIO,
      PC.BLFINALIZACAOINDEPENDENTE,
      PC.OBFINALIZAOINDEPENDENTE,
      PC.OBPROTOCOLOCALIBRACAO,
      PC.STPROTOCOLO,
      PC.DSEQUIPAMENTONOTA,
      PC.DSACESSORIOS,
      PC.DTINICIOPARADA,
      PC.DTFIMPARADA,
      PC.DHDISPEMBALAGEM,
      PC.DTCANCELAMENTO,
      PC.QTDIASSERVICO,
      PC.OBCANCELAMENTO,
      PC.OBINSPECAO,
      PC.BLNAOCOBRAR,
      PC.DSMOTIVONAOCOBRANCA,
      PC.CDCERTIFICADO,
      PC.BLCERTIFICADOAPROVADO,
      PC.NRPEDIDO,
      PC.VLDECLARADO,
      PC.VLSERVICO,
      SGL.GL_F_UPP_TO_REAL(PC.VLSERVICO, O.DTGERACAO) AS VLSERVICOREAIS,
      PC.TPCOBRANCA,
      PC.BLCOBRADOSEBRAE,
      (SELECT COUNT(*)
      FROM SGL.GL_PROTOCOLOCALIBRACAONOTA PCN
      WHERE PCN.IDPROTOCOLOCALIBRACAO = PC.IDPROTOCOLOCALIBRACAO
      AND PCN.TPASSOCIACAO in (‘A’, ‘C’)) AS NRASSOCIACOESNOTA,
      ‘C’ || PC.CDPROTOCOLO AS CCDPROTOCOLO,
      CASE WHEN PC.DHDISPCALIBRACAO IS NULL THEN null ELSE SGL.GL_F_CALCULA_ETAPA_PROTOCOLO(PC.DHDISPCALIBRACAO, PC.QTDIASSERVICO, PC.STPROTOCOLO) END AS DTETAPA,
      O.IDORCAMENTO,
      O.TPORCAMENTO || O.NRORCAMENTO || NRCOMPLEMENTAR AS NRORCAMENTOTOTAL,
      TE.NMTIPOEQUIPAMENTO,
      F.NMFABRICANTE,
      TE.NMTIPOEQUIPAMENTO || NVL2(F.NMFABRICANTE,’ – ‘,”) || F.NMFABRICANTE || NVL2(E.NMMODELO,’ – ‘,”) || E.NMMODELO || NVL2(EC.NRSERIE,’ – ‘,”) || EC.NRSERIE || NVL2(EC.NRTAG,’ – ‘,”) || EC.NRTAG AS DSEQUIPAMENTO,
      NVL2(E.NMMODELO,’ – ‘,”) || E.NMMODELO || NVL2(EC.NRSERIE,’ – ‘,”) || EC.NRSERIE || NVL2(EC.NRTAG,’ – ‘,”) || EC.NRTAG AS MODELO,
      NVL2(E.NMMODELO,’ – ‘,”) || E.NMMODELO AS NMEQUIPAMENTO,
      SGL.GL_F_SOMA_DIAS_UTEIS2(O.IDORCAMENTO) AS DTENTREGA,
      R.NRNOTAFISCAL,
      R.NRNOTAFISCAL AS NRNOTAFISCALPRO,
      R.DHENTRADA,
      EM.NMEMPRESA,
      EM.BLPROTESTO,
      EM.NMEMPRESA AS NMEMPRESAPRO,
      EM.IDCLIENTE,
      EM.IDCLIENTE AS IDCLIENTEPRO,
      EM.BLCLIENTELABELO,
      EM2.NMEMPRESA AS NMREQUERENTE,
      EM2.IDCLIENTE AS IDREQUERENTE,
      EM2.BLPROTESTO AS BLPROTESTOREQUERENTE,
      TE.IDTIPOEQUIPAMENTO,
      E.IDEQUIPAMENTO,
      F.IDFABRICANTE,
      EC.NRSERIE,
      EC.NRTAG,
      PL.IDPLANOCALIBRACAO,
      PL.DSPLANOCALIBRACAO,
      D.IDDEPARTAMENTO,
      D.NMDEPARTAMENTO,
      CL.NMCOLABORADOR,
      CL.IDCOLABORADOR,
      R.STRECEBIMENTO,
      R.IDRECEBIMENTO,
      R.TPRECEBIMENTO,
      R.IDTRANSPORTADORA,
      R.NMCONTATOENTREGA,
      R.NRDOCUMENTOCONTATO,
      R.IDREQUERENTE AS RIDREQUERENTE,
      (SELECT E.NMEMPRESA FROM SGL.GL_EMPRESA E WHERE E.IDCLIENTE = R.IDREQUERENTE) AS RNMREQUERENTE,
      (SELECT MAX(C.NMCONTATO) FROM SGL.GL_CONTATO C WHERE C.IDCLIENTE = R.IDTRANSPORTADORA ) AS NMCONTATOTRANSPORTADORA,
      (SELECT MAX(C.NRTELEFONE) FROM SGL.GL_CONTATO C WHERE C.IDCLIENTE = R.IDTRANSPORTADORA) AS NRTELEFONE,
      (SELECT MAX(IDDOCUMENTOANEXO) FROM SGL.GL_DOCUMENTOANEXO DA WHERE DA.IDPROTOCOLOCALIBRACAO = PC.IDPROTOCOLOCALIBRACAO AND DA.TPDOCUMENTO = ‘C’) AS IDANEXO,
      (SELECT MAX(IDHISTORICO) FROM SGL.GL_HISTORICO H WHERE H.IDPROTOCOLOCALIBRACAO = PC.IDPROTOCOLOCALIBRACAO) AS IDHISTORICO,
      (SELECT MIN(PC2.STPROTOCOLO) FROM SGL.GL_PROTOCOLOCALIBRACAO PC2 WHERE PC2.IDRECEBIMENTO = R.IDRECEBIMENTO AND (CASE WHEN PC2.STPROTOCOLO = ‘PR’ THEN 0
      WHEN PC2.STPROTOCOLO = ‘AO’ THEN 1
      WHEN PC2.STPROTOCOLO = ‘EC’ THEN 2
      WHEN PC2.STPROTOCOLO = ‘PD’ THEN 3
      WHEN PC2.STPROTOCOLO = ‘CB’ THEN 4
      WHEN PC2.STPROTOCOLO = ‘EN’ THEN 5
      WHEN PC2.STPROTOCOLO = ‘AE’ THEN 6
      WHEN PC2.STPROTOCOLO = ‘AN’ THEN 7
      WHEN PC2.STPROTOCOLO = ‘AV’ THEN 8
      WHEN PC2.STPROTOCOLO = ‘ET’ THEN 9
      WHEN PC2.STPROTOCOLO = ‘ES’ THEN 10
      WHEN PC2.STPROTOCOLO = ‘CN’ THEN 11 END) = (SELECT MIN(CASE WHEN PC3.STPROTOCOLO = ‘PR’ THEN 0
      WHEN PC3.STPROTOCOLO = ‘AO’ THEN 1
      WHEN PC3.STPROTOCOLO = ‘EC’ THEN 2
      WHEN PC3.STPROTOCOLO = ‘PD’ THEN 3
      WHEN PC3.STPROTOCOLO = ‘CB’ THEN 4
      WHEN PC3.STPROTOCOLO = ‘EN’ THEN 5
      WHEN PC3.STPROTOCOLO = ‘AE’ THEN 6
      WHEN PC3.STPROTOCOLO = ‘AN’ THEN 7
      WHEN PC3.STPROTOCOLO = ‘AV’ THEN 8
      WHEN PC3.STPROTOCOLO = ‘ET’ THEN 9
      WHEN PC3.STPROTOCOLO = ‘ES’ THEN 10
      WHEN PC3.STPROTOCOLO = ‘CN’ THEN 11 END) FROM SGL.GL_PROTOCOLOCALIBRACAO PC3 WHERE PC3.IDRECEBIMENTO = R.IDRECEBIMENTO)) AS STPROTOCOLO3,
      CASE WHEN PC.STPROTOCOLO = ‘PR’ THEN 0
      WHEN PC.STPROTOCOLO = ‘AO’ THEN 1
      WHEN PC.STPROTOCOLO = ‘EC’ THEN 2
      WHEN PC.STPROTOCOLO = ‘PD’ THEN 3
      WHEN PC.STPROTOCOLO = ‘CB’ THEN 4
      WHEN PC.STPROTOCOLO = ‘EN’ THEN 5
      WHEN PC.STPROTOCOLO = ‘AE’ THEN 6
      WHEN PC.STPROTOCOLO = ‘AN’ THEN 7
      WHEN PC.STPROTOCOLO = ‘AV’ THEN 8
      WHEN PC.STPROTOCOLO = ‘ET’ THEN 9
      WHEN PC.STPROTOCOLO = ‘ES’ THEN 10
      WHEN PC.STPROTOCOLO = ‘CN’ THEN 11
      END PESO_SITUACAO,
      SGL.GL_F_RETORNA_DOMINIO(‘STPROTOCOLO’,PC.STPROTOCOLO) AS STPROTOCOLO2,
      (SELECT MAX(NF.NRNOTAFISCAL)
      FROM SGL.GL_PROTOCOLOCALIBRACAONOTA PCN,
      SGL.GL_NOTAFISCAL NF
      WHERE PC.IDPROTOCOLOCALIBRACAO = PCN.IDPROTOCOLOCALIBRACAO
      AND NF.STNOTAFISCAL IN (‘C’,’E’)
      AND PCN.IDNOTAFISCAL = NF.IDNOTAFISCAL
      AND PCN.TPASSOCIACAO = ‘C’) AS NRNOTACOBRANCA,
      (SELECT MAX(NF.NRNOTAFISCAL)
      FROM SGL.GL_PROTOCOLOCALIBRACAONOTA PCN, SGL.GL_NOTAFISCAL NF
      WHERE PC.IDPROTOCOLOCALIBRACAO = PCN.IDPROTOCOLOCALIBRACAO
      AND NF.STNOTAFISCAL IN (‘C’,’E’)
      AND PCN.IDNOTAFISCAL = NF.IDNOTAFISCAL
      AND PCN.TPASSOCIACAO = ‘R’) AS NRNOTAREMESSA
      FROM SGL.GL_PROTOCOLOCALIBRACAO PC,
      SGL.GL_ITEMCALIBRACAO IC,
      SGL.GL_PLANOCALIBRACAO PL,
      SGL.GL_EQUIPAMENTOCLIENTE EC,
      SGL.GL_ORCAMENTO O,
      SGL.GL_EQUIPAMENTO E,
      SGL.GL_TIPOEQUIPAMENTO TE,
      SGL.GL_FABRICANTE F,
      SGL.GL_RECEBIMENTO R,
      SGL.GL_EMPRESA EM,
      SGL.GL_EMPRESA EM2,
      SGL.GL_DEPARTAMENTO D,
      SGL.GL_COLABORADOR CL
      WHERE PC.IDITEMCALIBRACAO = IC.IDITEMCALIBRACAO (+)
      AND IC.IDORCAMENTO = O.IDORCAMENTO (+)
      AND PC.IDPLANOCALIBRACAO = PL.IDPLANOCALIBRACAO (+)
      AND PC.IDEQUIPAMENTOCLIENTE = EC.IDEQUIPAMENTOCLIENTE
      AND EC.IDEQUIPAMENTO = E.IDEQUIPAMENTO
      AND E.IDTIPOEQUIPAMENTO = TE.IDTIPOEQUIPAMENTO
      AND E.IDFABRICANTE = F.IDFABRICANTE
      AND PC.IDRECEBIMENTO = R.IDRECEBIMENTO
      AND R.IDCLIENTE = EM.IDCLIENTE (+)
      AND R.IDREQUERENTE = EM2.IDCLIENTE (+)
      AND PC.IDDEPARTAMENTO = D.IDDEPARTAMENTO (+)
      AND PC.IDCOLABORADOR = CL.IDCOLABORADOR
      ORDER BY PC.CDPROTOCOLO DESC;

      Segue o arquivo com o plano de execução, além dos índices que podemos criar, queria saber o que mais podemos fazer para melhorar esse código.

      Att.

      Mpungan

      Attachments:
      #106070
      Avatar de Fábio PradoFábio Prado
      Participante

        @mpungan

        Eu até gostaria de te ajudar MAIS, mas infelizmente é difícil por questões de tempo e acho que até agora ninguém respondeu por causa disso também!

        SQL Tuning não é uma tarefa muito fácil! Em queries como essa é muito demorado analisar, entender e dar sugestões de melhorias. Eu levaria no mínimo 1 dia inteiro para entender o que você está fazendo e o que você precisa fazer para REALMENTE tunar essa query. Vou dar abaixo apenas algumas sugestões simples de coisas que vi rapidamente na query (e que talvez vc já até saiba):

        1- Veja se é possível eliminar o DISTINCT;
        2- Elimine todas as funções desnecessárias;
        3- Substitua os outer joins por inner joins se possível;
        4- Tire o ORDER BY do SQL. Fazer ordenação na aplicação normalmente é muito mais rápido;
        5- Crie cautelosamente índices nas colunas de filtro e FKs, mas cuidado, os índices melhoram a performance das consultas, mas pioram a performance de INSERT, UPDATE e DELETE.
        6- Utilize a cláusula WITH para tabelas que são referenciadas N vezes na instrução SQL.

        []s

        Fábio Prado
        http://www.fabioprado.net

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