Движок таблиц PostgreSQL
Движок PostgreSQL позволяет выполнять запросы SELECT и INSERT к данным, хранящимся на удалённом сервере PostgreSQL.
В настоящее время поддерживаются только версии PostgreSQL 12 и выше.
Пользователям ClickHouse Cloud рекомендуется использовать ClickPipes для потоковой передачи данных из Postgres в ClickHouse. Это обеспечивает встроенную поддержку высокопроизводительной вставки, при этом сохраняя разделение зон ответственности за счёт возможности независимо масштабировать ингестию и ресурсы кластера.
Создание таблицы
См. подробное описание запроса 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. Чем больше число в карте, тем ниже приоритет. Наивысший приоритет — 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
Использование схемы, отличной от схемы по умолчанию
См. также