Buenos días, los molesto para consultarles sobre un explain que me llama la
atención.
La consulta que analizo es:
explain SELECT
c.id_comprobante,
c.fecha_comprobante,
s.afiapellido,
s.afinombre,
s.afidni,
s.clavebeneficiario,
string_agg(tp_codigo||nom_objetopres||coalesce(p.diag_codigo,v.diag_codigo),
' - ')  prestaciones,
sum(cantidad*precio_prestacion) subtt
FROM
facturacion.comprobante c
inner join facturacion.prestacion2 p using(id_comprobante)
inner join facturacion.valuacion v using (id_valuacion)
inner join facturacion.nomenclador2 using(nom_id)
left join nacer.smiafiliados s using(id_smiafiliados)
WHERE
id_factura=5675
GROUP BY
1,2,3,4,5,6
ORDER BY
c.id_comprobante DESC

El resultado que obtengo es:
"GroupAggregate  (cost=23601.13..23610.25 rows=192 width=84)"
"  ->  Sort  (cost=23601.13..23601.61 rows=192 width=84)"
"        Sort Key: c.id_comprobante, c.fecha_comprobante, s.afiapellido,
s.afinombre, s.afidni, s.clavebeneficiario"
"        ->  Nested Loop Left Join  (cost=467.36..23593.85 rows=192
width=84)"
"              ->  Hash Join  (cost=467.36..22059.15 rows=192 width=42)"
"                    Hash Cond: (v.nom_id = nomenclador2.nom_id)"
"                    ->  Nested Loop  (cost=423.70..22012.85 rows=192
width=38)"
"                          ->  Hash Join  (cost=423.70..21062.50 rows=192
width=35)"
"                                Hash Cond: (p.id_comprobante =
c.id_comprobante)"
"                                ->  Seq Scan on prestacion2 p
 (cost=0.00..16818.19 rows=1018319 width=23)"
"                                ->  Hash  (cost=420.87..420.87 rows=226
width=16)"
"                                      ->  Index Scan using
"IX_Relationship4" on comprobante c  (cost=0.00..420.87 rows=226 width=16)"
"                                            Index Cond: (id_factura =
5675)"
"                          ->  Index Scan using valuacion_pk on valuacion v
 (cost=0.00..4.94 rows=1 width=11)"
"                                Index Cond: (v.id_valuacion =
p.id_valuacion)"
"                    ->  Hash  (cost=29.96..29.96 rows=1096 width=12)"
"                          ->  *Seq Scan on nomenclador2  (cost=0.00..29.96
rows=1096 width=12)"*
"              ->  Index Scan using smiafiliados_pkey on smiafiliados s
 (cost=0.00..7.98 rows=1 width=50)"
"                    Index Cond: (c.id_smiafiliados = s.id_smiafiliados)"

Y lo que me llama la atención, es la línea marcada con rojo, ya que dice
que va a utilizar una búsqueda secuencial.
Supongo que establecida una fila de la tabla valuación, proyecta el valor
de la columna nom_id para obtener la correspondiente fila relacionada de
nomenclador2, y esta tabla, de unas 1200 filas, tiene como clave primaria
justamente a nom_id. Entonces, porque el planificador dice que va a
utilizar una búsqueda secuencial? No sería lo lógico que utilice un acceso
por índice?

Desde ya muchas gracias por las aclaraciones que me puedan brindar y por
tomarse el tiempo de leer todo esto.

Saludos.

Guillermo Villanueva

Responder a