2012-04-18 25 views
5

İç içe geçmiş bir döngü kullanarak iki tabloyu, TableA ve TableB'yi eşitleyen bir sorgulamam var. "Equi" -kadaş kontrata bağlı olarak, sonuçta döndürülen tüm satırlar bu nedenle bu iki tablonun her birinden en az bir sıraya karşılık gelecektir. Ancak, (EXPLAIN ANALYZE) planına göre, nihai sonuçta bir satır döndürülse bile, gerçek satır sayısı TabloB'den 0'dır. gerçek satırlar burada nasıl eşittir?PostgreSQL planımda satır sayısı neden 0?

=> 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 

Ve iki tablo tanımları ... ilk ürünler tablosu:: İşte

yürütme planı

=> \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) 

stok tablosu:

=> \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

Sorguyu gönderin ve açıklama planını gönderin – Samson

+0

PostgreSQL sürümünüz nedir? – vyegorov

cevap

4

gerçek iç indeks taramasının satırları, her çağrıda döndürülen ortalama satır sayısıdır.

http://www.postgresql.org/docs/current/static/using-explain.html baktığımızda: bazı sorgu planlarında

, bir subplan düğüm defadan fazla yürütülecek mümkündür. Örneğin, iç indeks taraması, yukarıdaki iç içe döngü planında dış sıra başına bir kez yürütülür. Bu gibi durumlarda, döngüler değeri düğümün toplam yürütme sayısını bildirir ve gösterilen gerçek zaman ve satır değerleri yürütme başına ortalama değerlerdir. Bu, rakamların maliyet tahminlerinin gösterildiği şekilde karşılaştırılabilir olması için yapılır. Düğümde harcanan toplam süreyi elde etmek için döngüler değeriyle çarpın.

Ben (ı ortalaması sonra, aşağı en yakın int tahmin ediyorum) yuvarlak nasıl emin değilim ama products çoğu satırlar stock karşılık gelen bir satır yok olabilir.