Движок таблиц PostgreSQL
Движок PostgreSQL позволяет выполнять запросы SELECT и INSERT к данным, хранящимся на удалённом сервере PostgreSQL.
В настоящее время для движка таблиц поддерживаются только версии PostgreSQL 12 и выше.
Обратите внимание на наш сервис Managed Postgres. Благодаря NVMe-хранилищу, физически расположенному рядом с вычислительными ресурсами, он обеспечивает до 10-кратного ускорения для нагрузок, ограниченных производительностью дисковой подсистемы, по сравнению с альтернативами, использующими сетевые хранилища, такие как EBS, и позволяет реплицировать ваши данные Postgres в ClickHouse с помощью коннектора Postgres CDC в ClickPipes.
Создание таблицы
См. подробное описание запроса 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 только для чтения с фиксацией (commit) после каждого запроса SELECT.
Простые выражения WHERE, такие как =, !=, >, >=, <, <= и IN, выполняются на сервере PostgreSQL.
Все соединения, агрегации, сортировка, условия IN [ array ], а также ограничение выборки LIMIT выполняются в ClickHouse только после завершения запроса к PostgreSQL.
Запросы INSERT на стороне PostgreSQL выполняются как COPY "table_name" (field1, field2, ... fieldN) FROM STDIN внутри транзакции PostgreSQL с автоматической фиксацией (auto-commit) после каждого оператора INSERT.
Типы Array в PostgreSQL преобразуются в массивы ClickHouse.
Будьте внимательны: в PostgreSQL массивы, созданные как type_name[], могут содержать многомерные массивы с разным числом измерений в разных строках таблицы в одном и том же столбце. В ClickHouse же допускаются только многомерные массивы с одинаковым числом измерений во всех строках таблицы в одном и том же столбце.
Поддерживается несколько реплик, которые должны быть перечислены через |. Например:
Поддерживается приоритизация реплик для источника словаря PostgreSQL. Чем больше число в map, тем ниже приоритет. Наивысший приоритет — 0.
В примере ниже реплика example01-1 имеет наивысший приоритет:
Пример использования
Таблица в PostgreSQL
Создание таблицы в ClickHouse и подключение к таблице PostgreSQL, созданной выше
В этом примере используется движок таблицы PostgreSQL для подключения таблицы ClickHouse к таблице PostgreSQL и выполнения операторов SELECT и INSERT над базой данных PostgreSQL:
Вставка начальных данных из таблицы PostgreSQL в таблицу ClickHouse с использованием запроса SELECT
Табличная функция postgresql копирует данные из PostgreSQL в ClickHouse. Её часто используют для повышения производительности запросов за счёт выполнения запросов и аналитики в ClickHouse, а не в PostgreSQL, а также для миграции данных из PostgreSQL в ClickHouse. Поскольку мы будем копировать данные из PostgreSQL в ClickHouse, мы используем в ClickHouse табличный движок MergeTree и назовём таблицу postgresql_copy:
Вставка инкрементальных данных из таблицы PostgreSQL в таблицу ClickHouse
Если после первоначальной вставки вы выполняете дальнейшую синхронизацию между таблицей PostgreSQL и таблицей ClickHouse, вы можете использовать предложение WHERE в ClickHouse, чтобы вставлять только данные, добавленные в PostgreSQL, на основе метки времени или уникального последовательного идентификатора.
Для этого потребуется отслеживать максимальный идентификатор или метку времени, добавленные ранее, например, следующим образом:
Затем вставляем из таблицы PostgreSQL только те значения, которые больше найденного максимума
Выбор данных из полученной таблицы ClickHouse
Использование нестандартной схемы
См. также