Как использовать индекс в запросе SELECT MAX (id) внешней таблицы в PostgreSQL?

У меня есть внешняя таблица (с использованием postgresql_fdw оболочки внешних данных), и мне нужно найти максимальный идентификатор для копирования всех записей. Когда я запускаю SELECT MAX(id) FROM foreign_table, похоже, что он не использует 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

Когда я запускаю тот же запрос (SELECT MAX(id) FROM table) в «реальной» таблице, он использует индекс:

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

База данных с внешней таблицей имеет версию 9.4.4, а база данных с «реальной» таблицей - версией 9.3.9.

Есть ли способ использовать индекс в первом запросе?


person szimek    schedule 23.11.2015    source источник


Ответы (1)


Postgres_fdw не имеет доступа к индексам. Используйте просмотр на удаленном сервере, например:

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

На локальном сервере определите оболочку для удаленного просмотра:

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

При выборе back_test_max будет использоваться удаленное представление и, следовательно, также индекс исходной удаленной таблицы.

person klin    schedule 23.11.2015
comment
Спасибо! Это отстой: / Если я хочу, например, скопировать все записи с created_at > date, мне пришлось бы создать новое представление и стороннюю таблицу для каждого значения даты, чтобы использовать индекс на created_at? - person szimek; 24.11.2015
comment
Если ваше приложение широко использует две базы данных одновременно, стоит рассмотреть возможность использования двух соединений. Во многих случаях это решение будет более эффективным. Fdw - относительно новая функция, которая, вероятно, будет разработана в будущем. - person klin; 24.11.2015