ClickHouse Managed Postgres — это Postgres корпоративного уровня на базе NVMe-хранилища, обеспечивающий производительность до 10 раз выше для дисковых рабочих нагрузок по сравнению с сетевыми хранилищами, такими как EBS. Это руководство по быстрому старту состоит из двух частей:
- Часть 1: Начало работы с NVMe Postgres и оценка его производительности
- Часть 2: Откройте для себя Real-time аналитику благодаря интеграции с ClickHouse
ClickHouse Managed Postgres в настоящее время доступен в AWS в нескольких регионах и находится в стадии публичной бета-версии.
В этом руководстве по быстрому старту вы:
- Создайте инстанс ClickHouse Managed Postgres с NVMe-производительностью
- Загрузите 1 миллион событий и посмотрите на скорость NVMe в деле
- Выполняйте запросы и оцените производительность с низкими задержками
- Реплицируйте данные в ClickHouse для Real-time аналитики
- Выполняйте запросы к ClickHouse напрямую из Postgres с помощью
pg_clickhouse
Часть 1: Начало работы с NVMe Postgres
Создание базы данных
Чтобы создать новый сервис ClickHouse Managed Postgres, нажмите кнопку New service в списке сервисов Cloud Console. После этого вы сможете выбрать Postgres в качестве типа базы данных.

Введите имя для вашего инстанса базы данных и нажмите Create service. Вы будете перенаправлены на страницу обзора.

Ваш инстанс ClickHouse Managed Postgres будет подготовлен и готов к использованию в течение 3–5 минут.
Подключитесь к базе данных
На боковой панели слева вы увидите кнопку Connect. Нажмите на неё, чтобы просмотреть сведения о подключении и строки подключения в различных форматах.

Скопируйте строку подключения psql и подключитесь к своей базе данных. Вы также можете использовать любой клиент, совместимый с Postgres, например DBeaver, или любую библиотеку приложения.
Оцените производительность NVMe
Давайте посмотрим, как проявляется производительность NVMe на практике. Сначала включите замер времени в psql, чтобы оценить время выполнения запроса:
\Создайте две тестовые таблицы для событий и пользователей:
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(255) NOT NULL,
event_type VARCHAR(100),
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
event_data JSONB,
user_id INT,
user_ip INET,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50),
platform VARCHAR(50)
);Теперь вставьте 1 миллион событий и посмотрите на скорость NVMe:
INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
'Event ' || gs::text AS event_name,
CASE
WHEN random() < 0.5 THEN 'click'
WHEN random() < 0.75 THEN 'view'
WHEN random() < 0.9 THEN 'purchase'
WHEN random() < 0.98 THEN 'signup'
ELSE 'logout'
END AS event_type,
NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
generate_series(1, 1000000) gs;INSERT 0 1000000
Time: 3596.542 ms (00:03.597)Вставьте 1 000 пользователей:
INSERT INTO users (name, country, platform)
SELECT
first_names[first_idx] || ' ' || last_names[last_idx] AS name,
CASE
WHEN random() < 0.25 THEN 'India'
WHEN random() < 0.5 THEN 'USA'
WHEN random() < 0.7 THEN 'Germany'
WHEN random() < 0.85 THEN 'China'
ELSE 'Other'
END AS country,
CASE
WHEN random() < 0.2 THEN 'iOS'
WHEN random() < 0.4 THEN 'Android'
WHEN random() < 0.6 THEN 'Web'
WHEN random() < 0.75 THEN 'Windows'
WHEN random() < 0.9 THEN 'MacOS'
ELSE 'Linux'
END AS platform
FROM
generate_series(1, 1000) AS seq
CROSS JOIN LATERAL (
SELECT
array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
1 + (seq % 32) AS first_idx,
1 + ((seq / 32)::int % 32) AS last_idx
) AS names;Выполнение запросов к данным
Теперь выполним несколько запросов, чтобы оценить скорость отклика Postgres с NVMe-хранилищем.
Агрегируйте 1 миллион событий по типу:
SELECT event_type, COUNT(*) as count
FROM events
GROUP BY event_type
ORDER BY count DESC; event_type | count
------------+--------
click | 499523
view | 375644
purchase | 112473
signup | 12117
logout | 243
(5 rows)
Time: 114.883 msЗапрос с фильтрацией JSONB и диапазоном дат:
SELECT COUNT(*)
FROM events
WHERE event_timestamp > NOW() - INTERVAL '30 days'
AND event_data->>'additional_info' LIKE 'info_5%'; count
-------
9042
(1 row)
Time: 109.294 msJOIN событий с пользователями:
SELECT u.country, COUNT(*) as events, AVG(LENGTH(e.event_data::text))::int as avg_json_size
FROM events e
JOIN users u ON e.user_id = u.user_id
GROUP BY u.country
ORDER BY events DESC; country | events | avg_json_size
---------+--------+---------------
USA | 383748 | 52
India | 255990 | 52
Germany | 223781 | 52
China | 127754 | 52
Other | 8727 | 52
(5 rows)
Time: 224.670 msЧасть 2: Добавление аналитики в реальном времени с помощью ClickHouse
Postgres отлично справляется с транзакционными рабочими нагрузками (OLTP), тогда как ClickHouse создан специально для аналитических запросов (OLAP) над большими наборами данных. Интегрируя обе системы, вы получаете лучшее из обоих миров:
- Postgres для транзакционных данных вашего приложения (вставки, обновления, точечные запросы по ключу)
- ClickHouse для аналитики по миллиардам строк за доли секунды
В этом разделе описано, как реплицировать данные из Postgres в ClickHouse и выполнять к ним запросы.
Настройка интеграции с ClickHouse
Теперь, когда в Postgres есть таблицы и данные, выполним репликацию таблиц в ClickHouse для аналитики. Начнём с нажатия на Sync to ClickHouse на боковой панели. Затем нажмите Replicate data in ClickHouse.

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

Нажмите Далее, чтобы перейти к выбору таблицы. Здесь вам нужно:
- Выберите базу данных ClickHouse, в которую нужно реплицировать данные.
- Разверните схему public и выберите таблицы users и events, которые мы создали ранее.
- Нажмите Replicate data to ClickHouse.

Начнётся процесс репликации, и вы будете перенаправлены на страницу обзора интеграции. Поскольку это первая интеграция, первоначальная настройка инфраструктуры может занять 2–3 минуты. Тем временем давайте посмотрим новое расширение pg_clickhouse.
Запросы к ClickHouse из Postgres
Расширение pg_clickhouse позволяет выполнять запросы к данным ClickHouse напрямую из Postgres с использованием стандартного SQL. Это означает, что ваше приложение может использовать Postgres как единый уровень запросов как для транзакционных, так и для аналитических данных. Подробнее см. в полной документации.
Включите расширение:
CREATE EXTENSION pg_clickhouse;Затем создайте подключение к внешнему серверу ClickHouse. Используйте драйвер http с портом 8443 для защищённых соединений:
CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
OPTIONS(driver 'http', host '<clickhouse_cloud_host>', dbname '<database_name>', port '8443');Замените <clickhouse_cloud_host> на имя хоста вашего ClickHouse, а <database_name> — на базу данных, выбранную при настройке репликации. Имя хоста можно найти в вашем сервисе ClickHouse, нажав Connect на боковой панели.

Теперь сопоставим пользователя Postgres с учётными данными сервиса ClickHouse:
CREATE USER MAPPING FOR CURRENT_USER SERVER ch
OPTIONS (user 'default', password '<clickhouse_password>');Теперь импортируйте таблицы ClickHouse в схему Postgres:
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "<database_name>" FROM SERVER ch INTO organization;Замените <database_name> на то же имя базы данных, которое вы использовали при создании сервера.
Теперь вы можете видеть все таблицы ClickHouse в своём клиенте Postgres:
\Аналитика в действии
Вернитесь на страницу интеграции. Вы должны увидеть, что начальная репликация завершена. Нажмите на название интеграции, чтобы просмотреть подробности.

Нажмите на имя сервиса, чтобы открыть консоль ClickHouse и просмотреть реплицированные таблицы.

Сравнение производительности Postgres и ClickHouse
Теперь выполним несколько аналитических запросов и сравним производительность Postgres и ClickHouse. Обратите внимание, что реплицированные таблицы используют соглашение об именовании public_<table_name>.
Запрос 1: Самые активные пользователи
Этот запрос находит наиболее активных пользователей с использованием нескольких агрегаций:
-- Via ClickHouse
SELECT
user_id,
COUNT(*) as total_events,
COUNT(DISTINCT event_type) as unique_event_types,
SUM(CASE WHEN event_type = 'purchase' THEN 1 ELSE 0 END) as purchases,
MIN(event_timestamp) as first_event,
MAX(event_timestamp) as last_event
FROM organization.public_events
GROUP BY user_id
ORDER BY total_events DESC
LIMIT 10; user_id | total_events | unique_event_types | purchases | first_event | last_event
---------+--------------+--------------------+-----------+----------------------------+----------------------------
1 | 31439 | 5 | 3551 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
2 | 13235 | 4 | 1492 | 2025-01-22 22:40:45.612281 | 2026-01-21 22:40:45.612281
...
(10 rows)
Time: 163.898 ms -- ClickHouse
Time: 554.621 ms -- Same query on PostgresЗапрос 2: Вовлечённость пользователей по стране и платформе
Этот запрос объединяет события с пользователями и вычисляет метрики вовлечённости:
-- Via ClickHouse
SELECT
u.country,
u.platform,
COUNT(DISTINCT e.user_id) as users,
COUNT(*) as total_events,
ROUND(COUNT(*)::numeric / COUNT(DISTINCT e.user_id), 2) as events_per_user,
SUM(CASE WHEN e.event_type = 'purchase' THEN 1 ELSE 0 END) as purchases
FROM organization.public_events e
JOIN organization.public_users u ON e.user_id = u.user_id
GROUP BY u.country, u.platform
ORDER BY total_events DESC
LIMIT 10; country | platform | users | total_events | events_per_user | purchases
---------+----------+-------+--------------+-----------------+-----------
USA | Android | 115 | 109977 | 956 | 12388
USA | Web | 108 | 105057 | 972 | 11847
USA | iOS | 83 | 84594 | 1019 | 9565
Germany | Android | 85 | 77966 | 917 | 8852
India | Android | 80 | 68095 | 851 | 7724
...
(10 rows)
Time: 170.353 ms -- ClickHouse
Time: 1245.560 ms -- Same query on PostgresСравнение производительности:
| Запрос | Postgres (NVMe) | ClickHouse (via pg_clickhouse) | Ускорение |
|---|---|---|---|
| Топ пользователей (5 агрегаций) | 555 ms | 164 ms | 3.4x |
| Вовлечённость пользователей (JOIN + агрегации) | 1,246 ms | 170 ms | 7.3x |
Очистка
Чтобы удалить ресурсы, созданные в рамках этого краткого руководства:
- Сначала удалите интеграцию ClickPipe из сервиса ClickHouse
- Затем удалите инстанс ClickHouse Managed Postgres из Cloud Console
Вы можете пройти этот путь самостоятельно, автоматизировать его с помощью скрипта или передать ИИ-агенту. Для версии в консоли переключитесь в режим интерфейса Cloud.
На этой странице описаны развертывание ClickHouse Managed Postgres, загрузка данных, их репликация в ClickHouse и выполнение запросов к ним — всё из командной строки с помощью ClickHouse CLI (clickhousectl) и psql. Команды выполняются в неинтерактивном режиме; clickhousectl выводит JSON при использовании --json.
Требования
Установите ClickHouse CLI:
curl https://clickhouse.com/cli | shВам также понадобятся psql (клиентские инструменты PostgreSQL; на macOS — brew install libpq) и jq.
Для операций записи (создание, удаление) требуется аутентификация по ключу API; вход через OAuth доступен только для чтения:
clickhousectl cloud auth login --api-key <YOUR_KEY> --api-secret <YOUR_SECRET>Либо задайте переменные окружения CLICKHOUSE_CLOUD_API_KEY и CLICKHOUSE_CLOUD_API_SECRET. Проверьте командой clickhousectl cloud auth status; в выводе должна быть запись с областью действия read/write.
Часть 1: Создайте Postgres и загрузите данные
Создайте сервис Postgres
Создайте сервис и сохраните полученный ответ; пароль отображается только один раз:
clickhousectl cloud postgres create \
--name quickstart-pg \
--region us-east-1 \
--size m6gd.large \
--pg-version 18 \
--json > pg.jsonВ ответе указаны идентификатор сервиса, имя хоста и готовая к использованию строка подключения:
{
"id": "3b5a3112-bf02-82d0-bd02-fbe67d5caa7a",
"name": "quickstart-pg",
"provider": "aws",
"region": "us-east-1",
"postgresVersion": "18",
"size": "m6gd.large",
"storageSize": 118,
"haType": "none",
"state": "creating",
"createdAt": "2026-07-22T13:21:22Z",
"hostname": "quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud",
"username": "postgres",
"password": "vV6cfEr2p_-TzkCDrZOx",
"connectionString": "postgres://postgres:vV6cfEr2p_-TzkCDrZOx@quickstart-pg-c1406b50.pg7dd324nz0a1qm1fqskxbjn7m.c0.us-east-1.aws.pg.clickhouse.cloud:5432/postgres?channel_binding=require",
"isPrimary": true,
"tags": []
}Получите всё, что понадобится далее в этом руководстве:
PG_ID=$(jq -r .id pg.json)
PG_URL=$(jq -r .connectionString pg.json)Если пароль потерян, сгенерируйте новый с помощью clickhousectl cloud postgres reset-password $PG_ID --generate.
Дождитесь, пока сервис будет создан
Подготовка занимает несколько минут. Проверяйте состояние, пока оно не станет running:
while [ "$(clickhousectl cloud postgres get "$PG_ID" --json | jq -r .state)" != "running" ]; do
sleep 15
doneЗагрузите пример данных
Создайте две таблицы и вставьте 1 миллион событий через psql:
psql "$PG_URL" <<'SQL'
\timing
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(255) NOT NULL,
event_type VARCHAR(100),
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
event_data JSONB,
user_id INT,
user_ip INET,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
user_id SERIAL PRIMARY KEY,
name VARCHAR(100),
country VARCHAR(50),
platform VARCHAR(50)
);
INSERT INTO events (event_name, event_type, event_timestamp, event_data, user_id, user_ip)
SELECT
'Event ' || gs::text AS event_name,
CASE
WHEN random() < 0.5 THEN 'click'
WHEN random() < 0.75 THEN 'view'
WHEN random() < 0.9 THEN 'purchase'
WHEN random() < 0.98 THEN 'signup'
ELSE 'logout'
END AS event_type,
NOW() - INTERVAL '1 day' * (gs % 365) AS event_timestamp,
jsonb_build_object('key', 'value' || gs::text, 'additional_info', 'info_' || (gs % 100)::text) AS event_data,
GREATEST(1, LEAST(1000, FLOOR(POWER(random(), 2) * 1000) + 1)) AS user_id,
('192.168.1.' || ((gs % 254) + 1))::inet AS user_ip
FROM
generate_series(1, 1000000) gs;
INSERT INTO users (name, country, platform)
SELECT
first_names[first_idx] || ' ' || last_names[last_idx] AS name,
CASE
WHEN random() < 0.25 THEN 'India'
WHEN random() < 0.5 THEN 'USA'
WHEN random() < 0.7 THEN 'Germany'
WHEN random() < 0.85 THEN 'China'
ELSE 'Other'
END AS country,
CASE
WHEN random() < 0.2 THEN 'iOS'
WHEN random() < 0.4 THEN 'Android'
WHEN random() < 0.6 THEN 'Web'
WHEN random() < 0.75 THEN 'Windows'
WHEN random() < 0.9 THEN 'MacOS'
ELSE 'Linux'
END AS platform
FROM
generate_series(1, 1000) AS seq
CROSS JOIN LATERAL (
SELECT
array['Alice', 'Bob', 'Charlie', 'Diana', 'Eve', 'Frank', 'Grace', 'Hank', 'Ivy', 'Jack', 'Liam', 'Olivia', 'Noah', 'Emma', 'Sophia', 'Benjamin', 'Isabella', 'Lucas', 'Mia', 'Amelia', 'Aarav', 'Riya', 'Arjun', 'Ananya', 'Wei', 'Li', 'Huan', 'Mei', 'Hans', 'Klaus', 'Greta', 'Sofia'] AS first_names,
array['Smith', 'Johnson', 'Williams', 'Brown', 'Jones', 'Garcia', 'Miller', 'Davis', 'Martinez', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin', 'Thompson', 'Moore', 'Lee', 'Perez', 'Sharma', 'Patel', 'Gupta', 'Reddy', 'Zhang', 'Wang', 'Chen', 'Liu', 'Schmidt', 'Müller', 'Weber', 'Fischer'] AS last_names,
1 + (seq % 32) AS first_idx,
1 + ((seq / 32)::int % 32) AS last_idx
) AS names;
SQLTiming is on.
CREATE TABLE
Time: 86.029 ms
CREATE TABLE
Time: 80.962 ms
INSERT 0 1000000
Time: 7120.357 ms (00:07.120)
INSERT 0 1000
Time: 84.807 msВставка 1 млн строк выполняется примерно за 7 секунд на m6gd.large (самом маленьком типоразмере) благодаря NVMe-хранилищу. Проверьте это запросом; количество строк от запуска к запуску различается, потому что данные генерируются с помощью random():
psql "$PG_URL" -c "SELECT event_type, COUNT(*) FROM events GROUP BY event_type ORDER BY 2 DESC;"Часть 2: Репликация данных в ClickHouse
Создайте сервис ClickHouse
Создайте сервис в том же регионе и сохраните ответ; пароль отображается только в ответе на создание:
clickhousectl cloud service create \
--name quickstart-ch \
--region us-east-1 \
--json > ch.json
CH_ID=$(jq -r .service.id ch.json)
CH_PASSWORD=$(jq -r .password ch.json)Подождите, пока он не заработает; для ClickPipe требуется работающий пункт назначения:
while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "running" ]; do
sleep 15
doneЧтобы использовать существующий сервис, задайте CH_ID, взяв его из вывода clickhousectl cloud service list, а в CH_PASSWORD укажите пароль пользователя default, который потребуется на этапе pg_clickhouse.
Реплицируйте таблицы в ClickHouse
Создайте Postgres CDC ClickPipe в сервисе ClickHouse, указав имя хоста ClickHouse Managed Postgres. Пайп скопирует существующие строки, а затем будет поддерживать синхронизацию ClickHouse с текущими изменениями:
PG_HOST=$(jq -r .hostname pg.json)
PG_PASSWORD=$(jq -r .password pg.json)
clickhousectl cloud clickpipe create postgres "$CH_ID" \
--name quickstart-sync \
--host "$PG_HOST" \
--pg-database postgres \
--username postgres \
--password "$PG_PASSWORD" \
--table-mapping public.events:public_events \
--table-mapping public.users:public_users \
--json > pipe.json
PIPE_ID=$(jq -r .id pipe.json)Примечания:
- Реплицируемые таблицы попадают в базу данных
defaultсервиса ClickHouse и получают имена в соответствии с целями--table-mapping - Публикация и слот репликации создаются автоматически; публикация при этом ограничивается сопоставленными таблицами. Передайте
--publication-name, чтобы использовать публикацию, которой вы управляете самостоятельно - Используйте прямое имя хоста Postgres; репликация через PgBouncer не поддерживается
Дождитесь, пока пайп не перейдёт в состояние Running
Пайп проходит состояния Provisioning, Setup и (для больших таблиц) Snapshot, прежде чем перейти в Running; для первого пайпа в сервисе это занимает около 4 минут. Failed и InternalError — конечные состояния:
while :; do
STATE=$(clickhousectl cloud clickpipe get "$CH_ID" "$PIPE_ID" --json | jq -r .state)
case "$STATE" in
Running) break ;;
Failed|InternalError) echo "ClickPipe entered terminal state: $STATE" >&2; exit 1 ;;
esac
sleep 15
doneВыполните запрос к реплицированным данным в ClickHouse
Выполняйте SQL-запросы к сервису ClickHouse напрямую из CLI. При первом вызове автоматически создаются конечная точка Query API и ключ API, ограниченный этим сервисом:
clickhousectl cloud service query --id "$CH_ID" \
--query "SELECT count() FROM public_events"Provisioning Query API endpoint + key for service 'quickstart-ch'...
1000000Новые данные, записываемые в Postgres, реплицируются непрерывно. Вставьте строку и выполняйте опрос, пока количество строк не достигнет 1 000 001 (обычно это занимает меньше минуты):
psql "$PG_URL" -c "INSERT INTO events (event_name, event_type, user_id, user_ip) VALUES ('cdc-test', 'click', 42, '10.0.0.1');"
while [ "$(clickhousectl cloud service query --id "$CH_ID" \
--query "SELECT count() FROM public_events")" != "1000001" ]; do
sleep 10
doneЗапросы к ClickHouse из Postgres
Расширение pg_clickhouse позволяет Postgres выступать в качестве единого слоя для запросов как к транзакционным, так и к аналитическим данным. Получите HTTPS-имя хоста ClickHouse, затем настройте расширение через psql:
CH_HOST=$(clickhousectl cloud service get "$CH_ID" --json \
| jq -r '.endpoints[] | select(.protocol=="https") | .host')
psql "$PG_URL" <<SQL
CREATE EXTENSION pg_clickhouse;
CREATE SERVER ch FOREIGN DATA WRAPPER clickhouse_fdw
OPTIONS(driver 'http', host '$CH_HOST', dbname 'default', port '8443');
CREATE USER MAPPING FOR CURRENT_USER SERVER ch
OPTIONS (user 'default', password '$CH_PASSWORD');
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "default" FROM SERVER ch INTO organization;
SQLHeredoc намеренно оставлен без кавычек, чтобы оболочка подставила $CH_HOST и $CH_PASSWORD до того, как SQL попадёт в Postgres. Реплицированные таблицы теперь видны как внешние таблицы в схеме organization; запросы к ним выполняются в ClickHouse.
По результатам измерений на m6gd.large с этим набором данных аналитические запросы через внешние таблицы выполняются в 6–9 раз быстрее (например, GROUP BY с 5 агрегациями: 176 мс через ClickHouse против 1 133 мс локально; JOIN с агрегациями: 298 мс против 2 764 мс).
Очистка
Сначала удалите ClickPipe, затем сервис Postgres. При удалении сервиса все его данные удаляются без возможности восстановления:
clickhousectl cloud clickpipe delete "$CH_ID" "$PIPE_ID"
clickhousectl cloud postgres delete "$PG_ID"Нельзя удалить работающий сервис ClickHouse напрямую. Остановите его, дождитесь состояния stopped, затем удалите:
clickhousectl cloud service stop "$CH_ID"
while [ "$(clickhousectl cloud service get "$CH_ID" --json | jq -r .state)" != "stopped" ]; do
sleep 10
done
clickhousectl cloud service delete "$CH_ID"