Bueno, ese no necesariamente lo entiendo como a veces sí y a veces no,
supongo va a depender de los casos de uso que vaya a tener el sistema.
Y si no es mucho abusar, en cuantos registros buscaría postgres si se hace
la sig consulta:
Tenemos las siguientes 3 tablas, cliente, material (que contiene
cliente_id) y cajas (que contiene material_id)
La tabla cajas tiene 1 millón de registros.

select count(e.*) from cajas e
left join material m on m.id = e.material_id
where cl.id = m.cliente_id

Ya que el filtro no es directamente sobre la tabla cajas, tendrá que hacer
el join primero y luego ya con el index por defecto que tiene cliente_id
hacer el filtrado, pero para hacer el join hay que recorrer primero todo el
millón de registros no?
Explain me arroja esto en particular:
Aggregate  (cost=14659.91..14659.92 rows=1 width=146)
  ->  Hash Join  (cost=303.13..14656.84 rows=1230 width=146)
        Hash Cond: (e.material_id = m.id)
        ->  Seq Scan on caja e  (cost=0.00..12652.84 rows=450284 width=150)
        ->  Hash  (cost=301.89..301.89 rows=99 width=4)
              ->  Bitmap Heap Scan on material m  (cost=5.18..301.89
rows=99 width=4)
                    Recheck Cond: (client_id = 10)
                    ->  Bitmap Index Scan on material_client_id_key1
(cost=0.00..5.16 rows=99 width=0)
                          Index Cond: (client_id = 10)


El Seq Scan me da a entender que efectivamente recorrerá primero todos los
registros de la tabla cajas.

2016-04-19 16:44 GMT-05:00 Alvaro Herrera <alvhe...@2ndquadrant.com>:

> Ivan Perales M. escribió:
> > Vamos a suponer que dejo los indices adecuados para las consultas mas
> > comúnes en una sola tabla. Todo es perfección hasta que el usuario dice,
> > necesito poder filtrar por todas las columnas, que haces? agregas indices
> > en cada una?
>
> No.  Cuando eso pasa simplemente dejas que el sistema escoja la mayor
> cantidad de índices que pueda y para el resto filtra los resultados
> usando el resto de las condiciones.  No necesitas índices en todas las
> columnas ni en todas las combinaciones, sólo en las más selectivas.
>
> Por otro lado, si instalas un índice BRIN en todas las columnas, las
> búsquedas se limitarán "automáticamente" a recorrer sólo los rangos de
> páginas que cumplan todas las condiciones.
>
> > y si filtra por dos o tres columnas de cualquier combinacion,
> > como prevees esta consulta para crear los indices adecuados?
>
> Postgres puede "mezclar" índices usando bitmaps.  Es una técnica muy
> efectiva.
>
> > No seria mejor combinar la separación por schema y la implementación de
> > indices adecuadamente?
>
> No necesariamente.
>
> --
> Álvaro Herrera                http://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>



-- 
Lindolfo Iván Perales Mancinas
Solo existen 10 tipos de personas en el mundo, las que saben binario y las
que no.

Responder a