2012-04-18 13 views
5

Tengo una consulta que une equitativamente dos tablas, TableA y TableB usando un ciclo anidado. Debido al contraint de unión "equi", todas las filas devueltas en el resultado corresponderán por lo menos a una fila de cada una de estas dos tablas. Sin embargo, de acuerdo con el plan (EXPLAIN ANALYZE) el recuento de filas reales es 0 desde TableB, aunque se devuelva una fila en el resultado final. ¿Cómo pueden las filas reales contar aquí el cero?¿Por qué el recuento de filas 0 en mi plan de PostgreSQL?

Aquí es el plan de ejecución:

=> explain analyze select p.id, p.title, s.count from products p, stock s where p.id = s.p_id and s.w_id = 6 and p.type = 9 and s.count > 0 order by p.title; 
                  QUERY PLAN               
------------------------------------------------------------------------------------------------------------------------------ 
Sort (cost=42.42..42.42 rows=2 width=36) (actual time=0.198..0.199 rows=1 loops=1) 
    Sort Key: p.title 
    Sort Method: quicksort Memory: 25kB 
    -> Nested Loop (cost=0.00..42.41 rows=2 width=36) (actual time=0.170..0.181 rows=1 loops=1) 
     -> Seq Scan on products p (cost=0.00..9.25 rows=4 width=32) (actual time=0.068..0.106 rows=4 loops=1) 
       Filter: (type = 9) 
     -> Index Scan using stock_pk on stock s (cost=0.00..8.28 rows=1 width=8) (actual time=0.015..0.015 rows=0 loops=4) 
       Index Cond: ((w_id = 6) AND (p_id = p.id)) 
       Filter: (count > 0) 
Total runtime: 0.290 ms 

Y las dos definiciones de tabla ... La tabla de productos de primera:

=> \d products 
      Table "public.products" 
Column |   Type   | Modifiers 
--------+------------------------+----------- 
id  | integer    | not null 
title | character varying(100) | 
type | integer    | 
price | double precision  | 
filler | character(500)   | 
Indexes: 
    "products_pkey" PRIMARY KEY, btree (id) 
    "products_type_idx" btree (type) 
Referenced by: 
    TABLE "orderline" CONSTRAINT "orderline_p_id_fkey" FOREIGN KEY (p_id) REFERENCES products(id) 
    TABLE "stock" CONSTRAINT "stock_p_id_fkey" FOREIGN KEY (p_id) REFERENCES products(id) 

La tabla stock:

=> \d stock 
    Table "public.stock" 
Column | Type | Modifiers 
--------+---------+----------- 
w_id | integer | not null 
p_id | integer | not null 
count | integer | 
Indexes: 
    "stock_pk" PRIMARY KEY, btree (w_id, p_id) 
    "stock_p_id_idx" btree (p_id) 
Foreign-key constraints: 
    "stock_p_id_fkey" FOREIGN KEY (p_id) REFERENCES products(id) 
    "stock_w_id_fkey" FOREIGN KEY (w_id) REFERENCES warehouses(id) 
+0

Publica la consulta y explica el plan – Samson

+0

¿Cuál es tu versión de PostgreSQL? – vyegorov

Respuesta

4

El actual las filas del análisis del índice interno son el número promedio de filas devueltas en cada llamada del mismo.

En cuanto a http://www.postgresql.org/docs/current/static/using-explain.html:

En algunos planes de consulta, es posible para un nodo subplán a ejecutar más de una vez. Por ejemplo, el escaneo de índice interno se ejecuta una vez por fila externa en el plan de ciclo anidado anterior. En tales casos, el valor de los bucles informa el número total de ejecuciones del nodo, y los valores reales de tiempo y filas mostrados son promedios por ejecución. Esto se hace para que los números sean comparables con la forma en que se muestran las estimaciones de costos. Multiplique por el valor de los bucles para obtener el tiempo total realmente gastado en el nodo.

no estoy seguro de cómo se redondea (supongo que hasta el int más cercano, después de promediar), pero podría ser que la mayoría de las filas de products no tienen una fila correspondiente en stock.

Cuestiones relacionadas