Hola a todos:
Para tratar de entender un comportamiento concreto del planificador
de consultas, he creado una base de datos de ejemplo con 2 tablas:
una llamada fathers (father_id, full_name) y otra llamada sons
(son_id, father_id, full_name). Como es evidente, existe una
relación muchos-a-uno de los hijos hacia los padres.
Bien, mi duda surge al ejecutar esta sencilla sentencia:
select f.father_id, s.son_id
from fathers f
join sons s on s.father_id = f.father_id
where f.father_id < 10;
Analizando el plan de la consulta (anteponiendo "analyze" a ésta)
aparece esto:
Hash Join (cost=15.34..31.26 rows=166 width=8)
Hash Cond: (s.father_id = f.father_id)
-> Seq Scan on sons s (cost=0.00..13.10 rows=310
width=8)
-> Hash (cost=14.00..14.00 rows=107 width=4)
-> Seq Scan on fathers f (cost=0.00..14.00 rows=107
width=4)
Filter: (father_id < 10)
Supongo que se me está escapando algo importante pero, ¿Por que en
esa línea marcada en negrita (la búsqueda secuencial en "sons") el
planificador no restringe la búsqueda también a aquellos hijos con
código de padre menor a 10, como hace al buscar los padres?
¿Significa este plan que pese a obtener 10 padres, luego recorre
absolutamente todos los hijos y no sólo los que tienen código de
padre menor que 10 (pese a que hay un índice "btree" creado en la
columna "father_id" de la tabla "sons")?
He probado a llenar las tablas con 10 millones de registros y, tras
ejecutar "analyze", el resultado es el mismo.
Muchas gracias.