Tratando de entender un plan de consulta con un INNER JOIN.

From: Igor <igor(at)negora(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Tratando de entender un plan de consulta con un INNER JOIN.
Date: 2012-08-08 16:25:54
Message-ID: 50229312.9080902@negora.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

<html>
<head>

<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Hola a todos:<br>
<br>
Para tratar de entender un comportamiento concreto del planificador
de consultas, he creado una base de datos de ejemplo con 2 tablas:
una llamada <b>fathers (father_id, full_name)</b> y otra llamada <b>sons
(son_id, father_id, full_name)</b>. Como es evidente, existe una
relación muchos-a-uno de los hijos hacia los padres.<br>
<br>
Bien, mi duda surge al ejecutar esta sencilla sentencia:<br>
<blockquote><tt>select f.father_id, s.son_id<br>
from fathers f<br>
join sons s on s.father_id = f.father_id<br>
where f.father_id &lt; 10;</tt><br>
<br>
</blockquote>
Analizando el plan de la consulta (anteponiendo "analyze" a ésta)
aparece esto:<br>
<blockquote><tt>Hash Join  (cost=15.34..31.26 rows=166 width=8)<br>
  Hash Cond: (s.father_id = f.father_id)<br>
  <b>-&gt;  Seq Scan on sons s  (cost=0.00..13.10 rows=310
width=8)</b><br>
  -&gt;  Hash  (cost=14.00..14.00 rows=107 width=4)<br>
        -&gt;  Seq Scan on fathers f  (cost=0.00..14.00 rows=107
width=4)<br>
              Filter: (father_id &lt; 10)</tt><br>
<br>
</blockquote>
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")?<br>
<br>
He probado a llenar las tablas con 10 millones de registros y, tras
ejecutar "analyze", el resultado es el mismo.<br>
<br>
Muchas gracias.<br>
</body>
</html>

Attachment Content-Type Size
unknown_filename text/html 2.1 KB

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2012-08-08 16:47:41 Re: Tratando de entender un plan de consulta con un INNER JOIN.
Previous Message Lazáro Rubén García Martínez 2012-08-08 15:51:38 RE: error instalación