× Linguagem de Programação ADVPL

Perguntas Otimizar query/relatório

Mais
11 anos 2 meses atrás - 11 anos 2 meses atrás #16827 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.

Mais
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.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.091 segundos
Joomla templates by a4joomla