Ivan Perales M. escribió:

> En algun momento del pasado, honestamente no recuerdo si leí o escuché que
> postgres por default creaba indices sobre las columnas que tienen un
> constraint foreign key.

Si leíste o escuchaste eso, la persona que habló o escribió estaba
tristemente equivocado.

> Nested Loop Left Join  (cost=0.00..3.28 rows=1 width=8)
>   Join Filter: (p.id = e.producto_id)
>   ->  Seq Scan on productomovimiento e  (cost=0.00..1.00 rows=1 width=8)
>         Filter: (producto_id = 10)
>   ->  Seq Scan on producto p  (cost=0.00..2.26 rows=1 width=4)
>         Filter: (id = 10)
> 
> Estoy viendo que realiza un escaneo secuencial para filtrar los movimientos
> de cierto producto, yo esperaria que utilizara un indice.

La verdad es que la existencia de un índice no obliga a que se lo use,
dependiendo de la consulta y dependiendo de otros factores como el
tamaño de la tabla -- si la tabla es muy pequeña es más rápido
recorrerla secuencialmente.  Pero si el índice no existe, obviamente no
hay alternativa.

Prueba \d en psql para verificar si el índice existe.

> Esto significa que efectivamente debo crear un indice manualmente en
> cada columna con el constraint foreign key?

... o índices multi-columna.

> si es así, por que el left join funciona muy rápido aun cuando se
> tengan algunos cientos de miles de filas?

Habría que ver el EXPLAIN ANALYZE.  Según el fragmento de EXPLAIN que
pegaste, no hay miles de registros sino un puñado.

-- 
Álvaro Herrera                https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a