How to use index in foreign table SELECT MAX(id) query in PostgreSQL?

こ雲淡風輕ζ 提交于 2019-12-07 02:45:40

问题


I've got a foreign table (using postgresql_fdw foreign data wrapper) and I need to find maximum ID to copy all records. When I run SELECT MAX(id) FROM foreign_table it doesn't seem to be using index:

Aggregate  (cost=205.06..205.07 rows=1 width=4) (actual time=13999.535..13999.535 rows=1 loops=1)
  ->  Foreign Scan on foreign_table  (cost=100.00..197.75 rows=2925 width=4) (actual time=1.288..13632.768 rows=1849305 loops=1)
Planning time: 0.087 ms
Execution time: 14019.179 ms

When I run the same query (SELECT MAX(id) FROM table) on the "real" table it uses index:

Result  (cost=0.45..0.46 rows=1 width=0) (actual time=0.164..0.165 rows=1 loops=1)
  InitPlan 1 (returns $0)
    ->  Limit  (cost=0.43..0.45 rows=1 width=4) (actual time=0.152..0.153 rows=1 loops=1)
       ->  Index Only Scan Backward using table_pkey on table  (cost=0.43..46102.55 rows=1821907 width=4) (actual time=0.143..0.143 rows=1 loops=1)
             Index Cond: (id IS NOT NULL)
             Heap Fetches: 1
Total runtime: 0.270 ms

The database with the foreign table has version 9.4.4 and the one with the "real" table has version 9.3.9.

Is there some way to use the index in the first query?


回答1:


Postgres_fdw has no access to indexes. Use view on a remote server, e.g.:

create view test_max as
select max(val) max_val
from test;

On local server define a wrapper for the remote view:

create foreign table back_test_max (
    max_val int
)
    server back_server
    options (schema_name 'public', table_name 'test_max');

Selects on back_test_max will use a remote view, and therefore also the index of the original remote table.



来源:https://stackoverflow.com/questions/33872467/how-to-use-index-in-foreign-table-select-maxid-query-in-postgresql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!