Перейти к основному содержимому
Перейти к основному содержимому

PostgreSQL Table Engine

PostgreSQL движок позволяет выполнять SELECT и INSERT запросы к данным, хранящимся на удалённом сервере PostgreSQL.

примечание

В данный момент поддерживаются только версии PostgreSQL 12 и выше.

Репликация или миграция данных Postgres с помощью PeerDB

В дополнение к движку таблиц Postgres, вы можете использовать PeerDB от ClickHouse для настройки непрерывного канала данных из Postgres в ClickHouse. PeerDB - это инструмент, специально разработанный для репликации данных из Postgres в ClickHouse с использованием захвата изменений данных (CDC).

Создание таблицы

Смотрите подробное описание запроса CREATE TABLE.

Структура таблицы может отличаться от оригинальной структуры таблицы PostgreSQL:

  • Имена колонок должны совпадать с именами в оригинальной таблице PostgreSQL, но вы можете использовать лишь некоторые из этих колонок и в любом порядке.
  • Типы колонок могут отличаться от тех, что в оригинальной таблице PostgreSQL. ClickHouse пытается привести значения к типам данных ClickHouse.
  • Параметр external_table_functions_use_nulls определяет, как обрабатывать Nullable колонки. Значение по умолчанию: 1. Если 0, функция таблицы не создаёт Nullable колонки и вместо null вставляет значения по умолчанию. Это также касается NULL значений внутри массивов.

Параметры движка

  • host:port — адрес сервера PostgreSQL.
  • database — имя удалённой базы данных.
  • table — имя удалённой таблицы.
  • user — пользователь PostgreSQL.
  • password — пароль пользователя.
  • schema — схема таблицы, отличная от схемы по умолчанию. Необязательно.
  • on_conflict — стратегия разрешения конфликтов. Пример: ON CONFLICT DO NOTHING. Необязательно. Примечание: добавление этой опции сделает вставку менее эффективной.

Рекомендуется использовать именованные коллекции (доступные с версии 21.11) в производственной среде. Вот пример:

Некоторые параметры можно переопределить с помощью аргументов ключ-значение:

Детали реализации

SELECT запросы на стороне PostgreSQL выполняются как COPY (SELECT ...) TO STDOUT внутри транзакции PostgreSQL только для чтения с коммитом после каждого SELECT запроса.

Простые условия WHERE, такие как =, !=, >, >=, <, <= и IN, выполняются на сервере PostgreSQL.

Все соединения, агрегирования, сортировки, условия IN [ array ] и ограничение выборки LIMIT выполняются в ClickHouse только после завершения запроса к PostgreSQL.

INSERT запросы на стороне PostgreSQL выполняются как COPY "table_name" (field1, field2, ... fieldN) FROM STDIN внутри транзакции PostgreSQL с автокоммитом после каждого оператора INSERT.

Типы Array PostgreSQL преобразуются в массивы ClickHouse.

примечание

Будьте осторожны - в PostgreSQL массив данных, созданный как type_name[], может содержать многомерные массивы разных размеров в разных строках таблицы в одном столбце. Однако в ClickHouse разрешено иметь только многомерные массивы одинакового количества измерений во всех строках таблицы в одном столбце.

Поддерживаются множественные реплики, которые должны быть перечислены через |. Например:

Поддерживается приоритет реплик для источника словаря PostgreSQL. Чем больше число в карте, тем меньше приоритет. Высший приоритет — 0.

В примере ниже реплика example01-1 имеет высший приоритет:

Пример использования

Таблица в PostgreSQL

Создание таблицы в ClickHouse и подключение к таблице PostgreSQL, созданной выше

Этот пример использует PostgreSQL движок таблицы для подключения таблицы ClickHouse к таблице PostgreSQL и использования как SELECT, так и INSERT операторов к базе данных PostgreSQL:

Вставка начальных данных из таблицы PostgreSQL в таблицу ClickHouse с использованием запроса SELECT

Функция таблицы postgresql копирует данные из PostgreSQL в ClickHouse, что часто используется для повышения производительности запросов к данным, запрашивая или выполняя аналитику в ClickHouse вместо PostgreSQL, или может также использоваться для миграции данных из PostgreSQL в ClickHouse. Поскольку мы будем копировать данные из PostgreSQL в ClickHouse, мы будем использовать движок таблицы MergeTree в ClickHouse и назовем его postgresql_copy:

Вставка инкрементальных данных из таблицы PostgreSQL в таблицу ClickHouse

Если затем выполнять постоянную синхронизацию между таблицей PostgreSQL и таблицей ClickHouse после начальной вставки, вы можете использовать условие WHERE в ClickHouse, чтобы вставлять только данные, добавленные в PostgreSQL на основе временной метки или уникального последовательностного идентификатора.

Это потребует отслеживания максимального ID или времени, ранее добавленного, как в следующем:

Затем вставка значений из таблицы PostgreSQL, больших, чем макс:

Выбор данных из полученной таблицы ClickHouse

Использование нестандартной схемы

Смотрите также