- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 11 anos, 1 mês atrás por Fábio Prado.
-
AutorPosts
-
22 de outubro de 2013 às 2:53 pm #106062mpunganParticipante
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:25 de outubro de 2013 às 1:31 am #106070Fábio PradoParticipante@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 -
AutorPosts
- Você deve fazer login para responder a este tópico.