Database 为什么我的PostgreSQL计划中的行数为0?
我有一个查询,它使用嵌套循环将两个表(TableA和TableB)相等地连接起来。由于“equi”-join CONTAint,因此结果中返回的所有行将至少对应于这两个表中的每一个表中的一行。但是,根据计划(解释分析),表B中的实际行数为0,即使最终结果中返回了一行。这里的实际行数如何等于零 以下是执行计划:Database 为什么我的PostgreSQL计划中的行数为0?,database,postgresql,sql-execution-plan,Database,Postgresql,Sql Execution Plan,我有一个查询,它使用嵌套循环将两个表(TableA和TableB)相等地连接起来。由于“equi”-join CONTAint,因此结果中返回的所有行将至少对应于这两个表中的每一个表中的一行。但是,根据计划(解释分析),表B中的实际行数为0,即使最终结果中返回了一行。这里的实际行数如何等于零 以下是执行计划: => explain analyze select p.id, p.title, s.count from products p, stock s where p.id = s.p_
=> 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)
内部索引扫描的实际行数是每次调用时返回的平均行数 看看: 在某些查询计划中,子计划节点可以执行多次。例如,在上面的嵌套循环计划中,每个外部行执行一次内部索引扫描。在这种情况下,loops值报告节点的总执行次数,并且显示的实际时间和行值是每次执行的平均值。这样做是为了使数字与成本估算的显示方式相比较。乘以loops值以获得在节点中实际花费的总时间
我不确定它是如何四舍五入的(我猜测在平均后会降到最接近的整数),但可能是
产品
中的大多数行在库存
中没有相应的行。请发布查询和解释计划。您的PostgreSQL版本是什么?