database - 为什么我的 PostgreSQL 计划中的行计数为 0?

标签 database postgresql sql-execution-plan

我有一个查询,它使用嵌套循环对两个表 TableA 和 TableB 进行等值连接。由于“equi”-join 约束,结果中返回的所有行将因此对应于这两个表中每一个的至少一行。但是,根据计划 (EXPLAIN ANALYZE),TableB 中的实际行数为 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)

最佳答案

内索引扫描的实际行数是每次调用返回的平均行数。

查看http://www.postgresql.org/docs/current/static/using-explain.html :

In some query plans, it is possible for a subplan node to be executed more than once. For example, the inner index scan is executed once per outer row in the above nested-loop plan. In such cases, the loops value reports the total number of executions of the node, and the actual time and rows values shown are averages per-execution. This is done to make the numbers comparable with the way that the cost estimates are shown. Multiply by the loops value to get the total time actually spent in the node.

我不确定它是如何四舍五入的(我猜是在取平均值后取最近的整数),但可能是 products 中的大多数行在库存

关于database - 为什么我的 PostgreSQL 计划中的行计数为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10207905/

相关文章:

sql - 如何在不更改查询的情况下改进此 oracle 11g 计划选择?

sql - sql中的串行数据类型

mysql - 使用 mysqldump 转储和加载 MySQL InnoDB 数据库的最快方法是什么?

postgresql - 有什么方法可以直接在JDBC中禁用参数或执行SQL语句吗?

mysql - 将列类型从 int 或 bigint 更改为时间戳

sql - SQL 执行计划是基于 Schema 还是 Data 还是基于两者?

django - django 中的独特约束

c# - 使用 C# 从 NVarchar(Max) 列流式传输数据

postgresql - 在 PostgreSQL 中连接多个表,并计算连接表的行数

oracle - 如何根据解释计划输出创建优化器提示?