- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Otimizar query/relatório
×
Linguagem de Programação ADVPL
Perguntas Otimizar query/relatório
- CaioTostes
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 80
- Obrigados Recebidos: 0
11 anos 2 meses atrás - 11 anos 2 meses atrás #16827
por CaioTostes
Otimizar query/relatório foi criado por CaioTostes
Bom dia pessoal. Preciso de uma dica pra otimizar o tempo de retorno dessa query. Por exemplo, se eu jogar um período de 30 dias 01/08 a 31/08 o relatorio está sendo gerado em 10 minutos. O volume de notas é um pouco grande mas todos os outros relatórios eu consigo um tempo bem menor colocando o mesmo período. O que poderia fazer pra otimizar isso? Grato.
_cQuery := "SELECT FILIAL=D2_FILIAL, CLIENTE=D2_CLIENTE, LOJA=D2_LOJA, NOME=A1_NOME, PRODUTO=D2_COD, QTDE=SUM(D2_QUANT), VEND=F2_VEND1, PRECO=SUM(F2_VALFAT), MEDIACP=SUM(E4_MEDIA), QTDNF=COUNT(D2_DOC) "
_cQuery += "FROM "+RetSqlName("SF2")+" F2, "+RetSqlName("SD2")+" D2, "+RetSqlName("SB1")+" B1, "+RetSqlName("SF4")+" F4, "+RetSqlName("SA1")+" A1, "+RetSqlName("SE4")+" E4 "
_cQuery += "WHERE "
If MV_PAR11 == 2
_cQuery += "D2_FILIAL = "+xFilial("SD2")+" AND "
Endif
_cQuery += "D2_FILIAL+D2_DOC+D2_SERIE=F2_FILIAL+F2_DOC+F2_SERIE AND "
_cQuery += "F2_COND=E4_CODIGO AND "
_cQuery += "D2_TES = F4_CODIGO AND "
_cQuery += "D2_CLIENTE+D2_LOJA=A1_COD+A1_LOJA AND "
_cQuery += "D2_COD = B1_COD AND "
_cQuery += "B1_GRUPO = '0001' AND "
_cQuery += "D2_CF > '5000' AND "
_cQuery += "F4_DUPLIC = 'S' AND F4_ESTOQUE = 'S' AND "
_cQuery += "D2_EMISSAO BETWEEN '"+DTOS(MV_PAR01)+"' AND '"+DTOS(MV_PAR02)+"' AND "
_cQuery += "D2_CLIENTE BETWEEN '"+MV_PAR03+"' AND '"+MV_PAR04+"' AND "
_cQuery += "D2_LOJA BETWEEN '"+MV_PAR05+"' AND '"+MV_PAR06+"' AND "
_cQuery += "F2_VEND1 BETWEEN '"+MV_PAR07+"' AND '"+MV_PAR08+"' AND "
_cQuery += "F2.D_E_L_E_T_ <> '*' AND "
_cQuery += "D2.D_E_L_E_T_ <> '*' AND "
_cQuery += "E4.D_E_L_E_T_ <> '*' AND "
_cQuery += "F4.D_E_L_E_T_ <> '*' AND "
_cQuery += "B1.D_E_L_E_T_ <> '*' AND "
_cQuery += "A1.D_E_L_E_T_ <> '*' "
If MV_PAR09 <> 1
If MV_PAR09 == 2
_cQuery += "AND A1_TIPO = 'F' "
Else
_cQuery += "AND A1_TIPO = 'S' "
Endif
Endif
If MV_PAR10 == 1
_cQuery += " AND A1_BANDEIR = '1' "
Endif
_cQuery += "GROUP BY D2_FILIAL, D2_CLIENTE, D2_LOJA, D2_COD, A1_NOME, F2_VEND1 "
_cQuery += "ORDER BY D2_FILIAL, A1_NOME, D2_CLIENTE, D2_LOJA, F2_VEND1, D2_COD"
Ultima edição: 11 anos 2 meses atrás por CaioTostes.
Por favor Acessar ou Registrar para participar da conversa.
- kanaamlrr
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 1576
- Obrigados Recebidos: 4
11 anos 2 meses atrás #16835
por kanaamlrr
Respondido por kanaamlrr no tópico Otimizar query/relatório
Caio, o ideal seria você trocar sua conexão entre as tabelas por inner joins, dessa forma a query fica mais performática.
Em seguida, mude a ordem dos campos no select e no where para que eles sigam a mesma ordem dos índices do sistema, dessa forma também fica mais rápido.
E sempre utilize como primeira cláusula do where o D_E_L_E_T_ <> '*' AND TAB_FILIAL = xFilial("TAB")
Outra coisa, sempre utilize primeiro os campos de uma tabela, depois outra e assim por diante.
Em seguida, mude a ordem dos campos no select e no where para que eles sigam a mesma ordem dos índices do sistema, dessa forma também fica mais rápido.
E sempre utilize como primeira cláusula do where o D_E_L_E_T_ <> '*' AND TAB_FILIAL = xFilial("TAB")
Outra coisa, sempre utilize primeiro os campos de uma tabela, depois outra e assim por diante.
Por favor Acessar ou Registrar para participar da conversa.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Otimizar query/relatório
Tempo para a criação da página:0.091 segundos