Re: [pgsql-es-ayuda] explain - esperaba el uso de índices

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: Martín Marqués <martin(at)2ndquadrant(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] explain - esperaba el uso de índices
Date: 2014-05-26 18:07:48
Message-ID: CANm+PCCgyioBfJZ4rJqW6yvyh027kDnrHNDi6tfgGzHwW7-JzQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: arpug pgsql-es-ayuda pgsql-es-fomento

Martín, tal como lo decís, sin límit el planificador resuelve el join con
seq scan y al poner limit ya utiliza los índices.
Te pido si vos tenés en claro porque no usa el índice para joins de tablas
tan grandes que me lo expliques porque lo que me comentás no creo que
justifique el descarte del índice, yo entiendo que por cada fila de h debe
buscar la coincidencia de la fila de s (s.clavebeneficiario es PK en s!) al
ser tan grande s y al tener que buscar una sola fila, ¿No es mas rápido con
el índice?

Desde ya muchas gracias

Guillermo Villanueva

El 26 de mayo de 2014, 14:24, Martín Marqués <martin(at)2ndquadrant(dot)com>escribió:

> El día 26 de mayo de 2014, 10:23, Guillermo E. Villanueva
> <guillermovil(at)gmail(dot)com> escribió:
> > explain
> > select *
> > from
> > nacer.historicotemp h
> > inner join nacer.smiafiliados s on
> > h.clavebeneficiario = s.clavebeneficiario;
> >
> > Con siguiente resultado
> >
> > "Hash Join (cost=33335.39..1817942.71 rows=5692774 width=1002)"
> > " Hash Cond: ((h.clavebeneficiario)::text =
> (s.clavebeneficiario)::text)"
> > " -> Seq Scan on historicotemp h (cost=0.00..578624.74 rows=5692774
> > width=762)"
> > " -> Hash (cost=15677.73..15677.73 rows=394773 width=240)"
> > " -> Seq Scan on smiafiliados s (cost=0.00..15677.73 rows=394773
> > width=240)"
> >
> > Ambas tablas tienen indexada la columna clavebeneficiario y como ven
> ambas
> > tablas creo que son lo suficientemente grande para la prueba.
> > (La tabla h tiene mas de 5 millones de registros y la tabla s tiene unos
> 400
> > mil registros)
> > Yo esperaba que al join lo haga utilizando índices, sin embargo veo que
> el
> > planificador no lo usa, ¿Tienen idea por qué?
>
> Eso es porque de todas formas va a tener que leer las dos tablas
> completas para poder entregarte las tuplas que se generan con el JOIN.
> Postgres sabe eso, y por lo tanto hace la busqueda secuencial (sino
> tendria que usar el indice y después hacer una busqueda secuencial, lo
> que es más costoso).
>
> Agregale un LIMIT 100 al final y veras que usa los indices.
>
> P.D.: Una consulta que retorna 5692774 filas no parece muy interesante.
>
> Saludos,
>
> --
> Martín Marqués http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Training & Services
>

In response to

Responses

Browse arpug by date

  From Date Subject
Next Message Martín Marqués 2014-05-26 18:15:16 Re: [pgsql-es-ayuda] explain - esperaba el uso de índices
Previous Message Martín Marqués 2014-05-26 17:24:49 Re: [pgsql-es-ayuda] explain - esperaba el uso de índices

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martín Marqués 2014-05-26 18:15:16 Re: [pgsql-es-ayuda] explain - esperaba el uso de índices
Previous Message Martín Marqués 2014-05-26 17:32:18 Re: [pgsql-es-ayuda] Validación de campos

Browse pgsql-es-fomento by date

  From Date Subject
Next Message Martín Marqués 2014-05-26 18:15:16 Re: [pgsql-es-ayuda] explain - esperaba el uso de índices
Previous Message Martín Marqués 2014-05-26 17:24:49 Re: [pgsql-es-ayuda] explain - esperaba el uso de índices