相关疑难解决方法(0)

如何在加入/推送到外部服务器之前强制评估子查询

假设我想查询一个带有几个WHERE过滤器的大表。我正在使用 Postgres 11 和外部表;外部数据包装器 (FDW) 是clickhouse_fdw. 但我也对通用解决方案感兴趣。

我可以这样做:

SELECT id,c1,c2,c3 from big_table where id=3 and c1=2
Run Code Online (Sandbox Code Playgroud)

我的 FDW 能够对远程外部数据源进行过滤,确保上述查询快速并且不会拉取太多数据。

如果我写的话上面的效果是一样的:

SELECT id,c1,c2,c3 from big_table where id IN (3,4,5) and c1=2
Run Code Online (Sandbox Code Playgroud)

即所有的过滤都被发送到下游。

但是,如果我尝试执行的过滤稍微复杂一些:

SELECT bt.id,bt.c1,bt.c2,bt.c3
from big_table bt
join lookup_table l on bt.id=l.id
where c1=2 and l.x=5
Run Code Online (Sandbox Code Playgroud)

然后查询规划器决定远程过滤c1=2,但在本地应用另一个过滤器。

在我的用例中,先计算哪些ids 有l.x=5,然后将其发送出去进行远程过滤会快得多,所以我尝试按以下方式编写:

SELECT id,c1,c2,c3
from big_table
where c1=2
and id IN (select id from lookup_table where x=5)
Run Code Online (Sandbox Code Playgroud)

big_table然而,查询规划器仍然决定在本地对satisfy的所有结果执行第二个过滤器c1=2,这非常慢。

有什么方法可以“强制”(select …

sql postgresql sql-execution-plan postgresql-performance foreign-data-wrapper

7
推荐指数
1
解决办法
1948
查看次数