Disculpen me equivoque, la consulta es así:

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

2016-04-19 17:23 GMT-05:00 Ivan Perales M. <ivan.pera...@gmail.com>:

> 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.
>



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

Responder a