从PostgreSQL 10.x开始,外部表支持聚合下推。
我注意到总和和计数操作被推送到远程服务器,但最小和最大不是以相同的方式推送。
select min(col) from foreign_table
显示具有 ORDER BY 的外部扫描,后跟本地应用的 LIMIT。
就我而言,远程服务器实际上是Redshift而不是另一个PostgreSQL实例,因此这将比在查询上发出min
要慢,就像总和或计数一样,奇怪的是,如果您执行这样的查询
select count(col), min(col) from foreign_table
min
将在查询上推送。
为什么postgres_fdw以不同的方式处理最小值/最大值,是否有优化器设置可以使最小值/最大值与其他聚合函数相同?
这实际上是最好和最快的方法。您是否测试了您的断言,即"这将比在查询上发出min
慢"?
PostgreSQL 按需从执行器节点获取元组,因此会发生的情况是从外部扫描(通过索引(获取第一行,然后LIMIT
将完成,不再读取行。这基本上与远程执行min
时发生的情况相同。