View lenta com Postgres
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?
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
Curtidas 0
Respostas
Emerson Nascimento
17/12/2018
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:
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)
GOSTEI 0
Rodrigo Galvan
17/12/2018
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.
Vou dar mais uma estudada nos indices pra ver se consigo melhorar a performance.
GOSTEI 0