2012-04-18 18 views
5

Tôi có một truy vấn tham gia hai bảng, TableA và TableB bằng cách sử dụng một vòng lặp lồng nhau. Do sự gắn kết "equi" -join, tất cả các hàng được trả lại trong kết quả do đó sẽ tương ứng với ít nhất một hàng từ mỗi trong hai bảng này. Tuy nhiên, theo kế hoạch (EXPLAIN ANALYZE), số hàng thực tế là 0 từ TableB, mặc dù một hàng được trả về trong kết quả cuối cùng. Làm cách nào để hàng thực tế đếm bằng 0 ở đây?Tại sao hàng đếm 0 trong kế hoạch PostgreSQL của tôi?

Dưới đây là kế hoạch thực hiệ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 

Và hai định nghĩa bảng ... Các sản phẩm bảng đầu tiên:

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

Bảng chứng khoán:

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

Đăng truy vấn và kế hoạch giải thích, vui lòng – Samson

+0

Phiên bản PostgreSQL của bạn là gì? – vyegorov

Trả lời

4

Các thực tế các hàng của quét chỉ mục bên trong là số hàng trung bình được trả về trong mỗi cuộc gọi của nó.

Nhìn vào http://www.postgresql.org/docs/current/static/using-explain.html:

Trong một số kế hoạch truy vấn, nó có thể cho một nút subplan được thực hiện nhiều hơn một lần. Ví dụ, quét chỉ mục bên trong được thực hiện một lần cho mỗi hàng bên ngoài trong kế hoạch vòng lặp lồng nhau ở trên. Trong những trường hợp như vậy, giá trị vòng lặp báo cáo tổng số lần thực thi của nút và giá trị thời gian và hàng thực tế được hiển thị là số trung bình cho mỗi lần thực thi. Điều này được thực hiện để làm cho các con số có thể so sánh được với cách ước tính chi phí được hiển thị. Nhân với giá trị vòng lặp để có tổng thời gian thực sự chi tiêu trong nút.

Tôi không chắc chắn làm thế nào nó được làm tròn (Tôi đoán xuống int gần nhất, sau khi trung bình), nhưng nó có thể là hầu hết các hàng trong products không có một hàng tương ứng trong stock.

Các vấn đề liên quan