Matheus,
Segui as suas sugestões, criei o indice *(trip_program_id, begintimestamp, COALESCE(endtimestamp, 'infinity')**)* que não surtiu muito efeito e em seguida mudei a consulta conforme você sugeriu, neste eu tive um resultado considerável, baixou para 28845.757 ms. SELECT '' as linha, '00:00' as nome,vehicle.vehiclecode as vehiclecode, vehicle.vehiclecode as codonibus,vehicle.vehicleid as vehicleVehicleid, public.vehicle.company_id as companyId, tb_company.name as companyName from public.vehicle, tb_company where public.vehicle.company_id in ( '1' , '3' ) and tb_company.id = public.vehicle.company_id and public.vehicle.enabled = true and not exists (select * from vehiclebusserviceplanned vbp2 where vbp2.vehicle_vehicleid = vehicle.vehicleid and exists (select vbp1.trip_program_id, max(vbp1.vehiclebusserviceplannedid) as vehiclebusserviceplannedid from vehiclebusserviceplanned vbp1 where vbp1.trip_program_id = vbp2.trip_program_id *AND '2015-04-06' BETWEEN begintimestamp AND COALESCE(endtimestamp, 'infinity')* group by vbp1.trip_program_id having max(vbp1.vehiclebusserviceplannedid) = vbp2.vehiclebusserviceplannedid)); A titulo de esclarecimento segue os indices que tenho no momento. Indexes: "vehiclebusserviceplanned_pkey" PRIMARY KEY, btree (vehiclebusserviceplannedid) "sugestao_idx" btree (trip_program_id, begintimestamp, (COALESCE(endtimestamp, 'infinity'::timestamp without time zone))) "vehiclebusserviceplanned_busservice_idx" btree (serviceid) "vehiclebusserviceplanned_vehicleid_idx" btree (vehicle_vehicleid) http://explain.depesz.com/s/qlHH No meu humildade entendimento, acredito que isto é até onde conseguimos ir. O próximo passo é mudar na aplicação. Em 6 de abril de 2015 17:06, Matheus de Oliveira <matioli.math...@gmail.com> escreveu: > > 2015-04-06 16:58 GMT-03:00 Matheus de Oliveira <matioli.math...@gmail.com> > : > >> On Mon, Apr 6, 2015 at 4:46 PM, Ariel Alves <arielalves...@gmail.com> >> wrote: >> >>> -> Index Scan using >>> vehiclebusserviceplanned_tripprogramid_idx on vehiclebusserviceplanned vbp1 >>> (cost=0.00..117.25 rows=9 width=16) (actual time=0.387..0.476 rows=0 >>> loops=736406) >>> Index Cond: (trip_program_id = >>> vbp2.trip_program_id) >>> Filter: (('2015-04-06'::date >= >>> (begintimestamp)::date) AND ('2015-04-06'::date <= >>> COALESCE((endtimestamp)::date, '2015-04-06'::date))) >>> >> >> Não analisei a consulta ainda, mas só por esse Index Scan, eu vejo que um >> índice em (trip_program_id, begintimestamp, endtimestamp) seria útil, você >> chegou a tentar esse índice? >> > > Ah, aproveitando, se está mapeando o "endtimestamp" como sendo NULL em > casos onde o final não é conhecido, você pode usar o 'infinity', pois > timestamp e timestamptz aceitam '-infinity' e 'infinity'. Se quiser testar > sem alterar a tabela, você pode usar: > > ... AND '2015-04-06' BETWEEN begintimestamp AND COALESCE(endtimestamp, > 'infinity') > > E um índice em: > > (trip_program_id, begintimestamp, COALESCE(endtimestamp, 'infinity')) > > Atenciosamente, > -- > Matheus de Oliveira > Analista de Banco de Dados > Dextra Sistemas - MPS.Br nível F! > www.dextra.com.br/postgres > > > _______________________________________________ > pgbr-geral mailing list > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral > > -- José Ariel Ferreira Alves arielalves...@gmail.com ariel.al...@msn.com
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral