View lenta com Postgres

17/12/2018

0

Olá, boa tarde!!

tenho a view abaixo que estou migrando do SQL Server para o Postgres, no sql ela é executada em média em 3 segundos, enquanto no postgres ela não termina nunca, preciso varrer a tabela de veiculos do sistema e retornar a ultima posição dela encontrada na tabela de posições (mais de um milhão de registros), alguém consegue me dar uma ajuda pra otimizar isso?

SELECT        			v.placa, CAST(mp.data || ' - ' || mp.posicao AS varchar(250)) AS Posicao, m.nome, mp.latitude, mp.longitude, mp.velocidade, mp.temperatura, vod.nome AS Operacao, vod.codigo AS opcodigo, 
                         via.embarcador AS codEmbarcador, viae.Embarcador, via.dtprevisaodescarga, v.idrastreador, v.status AS moniviagem, monis.cor, 
                         CAST(clife.razaosocial || ' - ' || crem.cidade || '/' || erem.uf AS varchar(80)) AS Remetente, v.viagem, CAST(clifd.razaosocial || ' - ' || cdes.cidade || '/' || edes.uf AS varchar(80)) AS Destinatario, monis.nome AS status, 
                         monis.codigo AS monicodigo
FROM            vei_Veiculos AS v INNER JOIN
                         fun_funcionario AS m ON m.placacavalo = v.placa LEFT OUTER JOIN
                         vei_Veiculos_Operacao_Dedicada AS vod ON v.operacaodedicada = vod.codigo LEFT OUTER JOIN
                         mon_Monitoramento_Posicoes AS mp ON v.idrastreador = mp.idrastreador LEFT OUTER JOIN
                         via_Viagens AS via ON v.viagem = via.codigo LEFT OUTER JOIN
                         via_Embarcador AS viae ON via.embarcador = viae.codigo LEFT OUTER JOIN
                         mon_Monitoramento_Status AS monis ON v.status = monis.codigo LEFT OUTER JOIN
                         cli_Clifor AS clife ON via.remetente = clife.codigo LEFT OUTER JOIN
                         loc_Cidades AS crem ON via.remcidade = crem.codigo LEFT OUTER JOIN
                         loc_Estados AS erem ON crem.uf = erem.codigo LEFT OUTER JOIN
                         cli_Clifor AS clifd ON via.destinatario = clifd.codigo LEFT OUTER JOIN
                         loc_Cidades AS cdes ON via.descidade = cdes.codigo LEFT OUTER JOIN
                         loc_Estados AS edes ON cdes.uf = edes.codigo
WHERE        (m.status = 0) AND (v.veiculotrabalhando = 'Sim') AND (v.idrastreador IS NOT NULL) AND (mp.codigo =
                             (SELECT        MAX(c.codigo) AS Expr1
                               FROM            mon_monitoramento_Posicoes AS c
                               WHERE        (c.idrastreador = mp.idrastreador)))
Rodrigo Galvan

Rodrigo Galvan

Responder

Posts

17/12/2018

Emerson Nascimento

A query roda diretamente? (direto, não como view)
Há índices para os campos utilizados nos relacionamentos?

Tente trocar a forma de obter o maior código da tabela mon_Monitoramento_Posicoes:
SELECT
	v.placa,
	CAST(mp.data || ' - ' || mp.posicao AS varchar(250)) AS Posicao,
	m.nome,
	mp.latitude, mp.longitude, mp.velocidade, mp.temperatura,
	vod.nome AS Operacao, vod.codigo AS opcodigo,
	via.embarcador AS codEmbarcador,
	viae.Embarcador,
	via.dtprevisaodescarga,
	v.idrastreador,
	v.status AS moniviagem,
	monis.cor,
	CAST(clife.razaosocial || ' - ' || crem.cidade || '/' || erem.uf AS varchar(80)) AS Remetente,
	v.viagem,
	CAST(clifd.razaosocial || ' - ' || cdes.cidade || '/' || edes.uf AS varchar(80)) AS Destinatario,
	monis.nome AS status, monis.codigo AS monicodigo
FROM
	vei_Veiculos AS v
INNER JOIN
	fun_funcionario AS m ON m.placacavalo = v.placa
LEFT JOIN
	vei_Veiculos_Operacao_Dedicada AS vod ON vod.codigo = v.operacaodedicada
LEFT JOIN
	(SELECT idrastreador, MAX(codigo) AS codigo
	FROM mon_monitoramento_Posicoes
	GROUP BY idrastreador) c on c.idrastreador = mp.idrastreador
LEFT JOIN
	mon_Monitoramento_Posicoes AS mp ON mp.idrastreador = c.idrastreador and mp.codigo = c.codigo
LEFT JOIN
	via_Viagens AS via ON via.codigo = v.viagem
LEFT JOIN
	via_Embarcador AS viae ON viae.codigo = via.embarcador
LEFT JOIN
	mon_Monitoramento_Status AS monis ON monis.codigo = v.status
LEFT JOIN
	cli_Clifor AS clife ON clife.codigo = via.remetente
LEFT JOIN
	loc_Cidades AS crem ON crem.codigo = via.remcidade
LEFT JOIN
	loc_Estados AS erem ON erem.codigo = crem.uf
LEFT JOIN
	cli_Clifor AS clifd ON clifd.codigo = via.destinatario
LEFT JOIN
	loc_Cidades AS cdes ON cdes.codigo = via.descidade
LEFT JOIN
	loc_Estados AS edes ON edes.codigo = cdes.uf
WHERE
	(m.status = 0)
	AND (v.veiculotrabalhando = 'Sim')
	AND (v.idrastreador IS NOT NULL)
Responder

17/12/2018

Rodrigo Galvan

Então, criei ela agora como view e está bem mais rápida, menos de 4 segundos, está dentro do aceitável.
Vou dar mais uma estudada nos indices pra ver se consigo melhorar a performance.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar