Используйте PostgreSQL pg_prewarm для внешней таблицы

У меня есть много внешних таблиц, импортированных IMPORT FOREIGN SCHEMA:

CREATE USER MAPPING FOR myuser
   SERVER postgres
   OPTIONS ( user 'myuser', password 'mypass');
IMPORT FOREIGN SCHEMA public from server postgres INTO public;

У меня есть много запросов, которые соединяют мои локальные таблицы и внешние таблицы.

Q1: Если я использую pg_prewarm и помещаю всю таблицу в память, это помогает мне не каждый раз брать эту таблицу по сети.

Q2: Меня беспокоит, будут ли изменения данных на внешнем сервере PostgreSQL видны на моем локальном сервере, если внешняя таблица кэширована.

Пример: core_category — внешняя таблица

SELECT pg_prewarm(
    'core_category',
    -- "pre warm" pages of the last 1000 pages for 'mytable'
    first_block := (
        SELECT pg_relation_size('core_category') / current_setting('block_size')::int4 - 1000
    )
);
-- or
SELECT * FROM pg_prewarm('core_category', 'buffer');

person madjardi    schedule 16.10.2018    source источник
comment
Я не понимаю. Где связь между pg_prewarm и внешними таблицами?   -  person Laurenz Albe    schedule 16.10.2018
comment
core_category - это внешняя таблица. если я всю таблицу положу в кеш, а на удаленном сервере она изменилась я использую старую версию таблицы?   -  person madjardi    schedule 16.10.2018
comment
Вы не можете предварительно согреть внешнюю таблицу, так как ее данных нет в базе данных. Ошибка ERROR: fork "main" does not exist for this relation. Вам нужно убедиться, что таблица находится в кеше внешнего источника данных.   -  person Laurenz Albe    schedule 16.10.2018
comment
очень помогло, вопрос закрыт   -  person madjardi    schedule 16.10.2018


Ответы (1)


Использование pg_prewarm на сторонней таблице не имеет смысла: поскольку таблица не хранится в PostgreSQL, PostgreSQL не может загрузить его в общие буферы или кеш файловой системы.

Действительно, попытка сделать это приведет к

ERROR: fork "main" does not exist for this relation

Чтобы ускорить запросы, связанные с внешней таблицей, вам нужно заставить внешний источник данных кэшировать данные в памяти.

person Laurenz Albe    schedule 16.10.2018