从PostgreSQL文档中,在解释EXPLAIN命令的基本知识时:
在处理外部联接时,您可能会看到连接计划节点同时具有“连接筛选器”和普通“筛选器”条件。联接筛选条件来自外部联接的ON子句,因此失败连接筛选条件的行仍然可以作为空扩展行发出。但是,在外部连接规则之后应用普通筛选条件,因此可以无条件地删除行。在内部联接中,这些类型的过滤器之间没有语义区别。
“联接筛选条件来自外部联接的ON子句”。那么在外部连接中,普通的过滤条件从何而来?
你能举几个例子吗?
谢谢。
发布于 2018-06-21 13:59:30
这里有一个小小的例子,可以启发你:
CREATE TABLE a(a_id) AS VALUES (1), (3), (4);
CREATE TABLE b(b_id) AS VALUES (1), (2), (5);现在我们必须强制一个嵌套的循环连接:
SET enable_hashjoin = off;
SET enable_mergejoin = off;我们的查询是:
SELECT *
FROM a
LEFT JOIN b ON a_id = b_id
WHERE a_id > coalesce(b_id, 0);
a_id | b_id
------+------
3 |
4 |
(2 rows)计划是:
QUERY PLAN
------------------------------------------
Nested Loop Left Join
Join Filter: (a.a_id = b.b_id)
Filter: (a.a_id > COALESCE(b.b_id, 0))
-> Seq Scan on a
-> Materialize
-> Seq Scan on b“普通过滤器”是在联接之后应用的条件。
认为WHERE子句中的条件与JOIN … ON子句中的条件相同是一个常见的错误。这只是内部连接的情况。对于外部联接,结果中还包括来自外部不满足条件的行。
这就需要有两个不同的过滤器。
发布于 2018-06-21 13:47:47
在Postgres文档的其他地方使用的“普通过滤条件”一词没有其他用法,因此我怀疑作者的意思是“普通”一词字面上是指没有修饰或精心修饰的;简单的或普通的。
因此,他们实际上是在说:“当筛选器应用到外部联接的ON子句中时,被连接的表或派生表在发生之前只是简单地被过滤,这将导致表中的任何列或结果集中的派生表为null”。
https://stackoverflow.com/questions/50969814
复制相似问题