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 <[email protected]>
escreveu:
>
> 2015-04-06 16:58 GMT-03:00 Matheus de Oliveira <[email protected]>
> :
>
>> On Mon, Apr 6, 2015 at 4:46 PM, Ariel Alves <[email protected]>
>> 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
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
--
José Ariel Ferreira Alves
[email protected]
[email protected]
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral