2012-04-18 7 views
5

중첩 루프를 사용하여 두 개의 테이블, TableA 및 TableB를 동등하게 결합하는 쿼리가 있습니다. 따라서 "equi"- 결합 제약 때문에 결과에 반환 된 모든 행은이 두 테이블 각각에서 적어도 하나의 행에 해당합니다. 그러나 계획 (EXPLAIN ANALYZE)에 따라 최종 결과에서 행이 리턴 되더라도 실제 행 수는 TableB에서 0입니다. 실제 행의 개수는 여기에서 어떻게 0입니까?PostgreSQL 계획에서 행 수가 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 

그리고 두 테이블 정의 ... 첫 제품 테이블 : 여기

는 실행 계획입니다

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

주식 테이블 :

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

질문 및 설명 계획 게시 – Samson

+0

PostgreSQL 버전은 무엇입니까? – vyegorov

답변

4

실제를 내부 색인 스캔의 행은 각 호출에서 리턴 된 평균 행 수입니다.

http://www.postgresql.org/docs/current/static/using-explain.html에서 상대 : 일부 쿼리 계획에서

를, 하위 계획 노드가 두 번 이상 실행하는 것이 가능하다. 예를 들어, 내부 인덱스 스캔은 위의 중첩 루프 계획에서 외부 행마다 한 번 실행됩니다. 이 경우 루프 값은 노드의 총 실행 수를보고하고 표시되는 실제 시간 및 행 값은 실행 당 평균입니다. 이는 비용 견적이 표시되는 방식과 비슷한 수치를 만들기 위해 수행됩니다. 루프 값을 곱하면 노드에서 실제로 소비 된 총 시간을 구할 수 있습니다.

나는 그것이 (나는 평균 후, 아래로 가장 가까운 int와 추측하고있어) 반올림 얼마나 잘 모르겠지만, 그것은 products에서 가장 행 stock에 대응하는 행을하지 않아도 될 수 있습니다.

관련 문제