ClickHouse Managed Postgres 是企业级 Postgres 服务,以 NVMe 存储为底层支撑,与 EBS 等网络附加存储相比,针对磁盘密集型工作负载可提供高达 10 倍的性能提升。本快速入门分为两个部分:
- 第 1 部分: 上手 NVMe Postgres,体验其性能
- 第 2 部分: 通过与 ClickHouse 集成,实现实时分析
ClickHouse Managed Postgres 目前已在 AWS 的多个区域上线,当前处于 Public Beta 阶段。
在本快速入门中,您将:
- 创建一个具备 NVMe 加速性能的 ClickHouse Managed Postgres 实例
- 加载 100 万条样本事件,直观感受 NVMe 速度
- 运行查询,体验低延迟性能
- 将数据复制到 ClickHouse 进行实时分析
- 使用
pg_clickhouse直接从 Postgres 查询 ClickHouse
Part 1:NVMe Postgres 入门
创建数据库
要创建新的 ClickHouse Managed Postgres service,请在 Cloud Console 的服务列表中点击 New service 按钮,然后即可选择 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)
);现在,插入 100 万条事件,看看 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;运行数据查询
现在我们来运行一些查询,看看采用 NVMe 存储的 Postgres 响应有多快。
按类型聚合 100 万条事件:
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 ms将事件与用户进行关联:
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第二部分:使用 ClickHouse 添加实时分析功能
Postgres 擅长处理事务性工作负载 (OLTP) ,而 ClickHouse 则专为大规模数据集上的分析查询 (OLAP) 而生。将两者结合,即可兼得两者之长:
- Postgres 用于存储应用程序的事务性数据 (插入、更新、点查)
- ClickHouse 用于对数十亿行数据进行亚秒级分析
本节介绍如何将 Postgres 数据复制到 ClickHouse 并进行无缝查询。
设置 ClickHouse 集成
现在 Postgres 中已有表和数据,接下来将这些表复制到 ClickHouse 以进行分析。首先点击侧边栏中的 Sync to ClickHouse,然后点击 Replicate data in ClickHouse。

在接下来的表单中,您可以为集成输入名称,并选择一个现有的 ClickHouse 实例作为复制目标。如果您尚未拥有 ClickHouse 实例,可以直接在此表单中创建一个。

点击 Next,进入表选择器。在此,您只需:
- 选择要复制到的 ClickHouse 数据库。
- 展开 public schema,并选择我们之前创建的 users 和 events 表。
- 点击 将数据复制到 ClickHouse。

复制过程将随即启动,您将被跳转至集成概览页面。由于这是首次集成,初始基础设施的配置可能需要 2 到 3 分钟。在此期间,我们来了解一下新的 pg_clickhouse 扩展。
从 Postgres 查询 ClickHouse
pg_clickhouse 扩展允许您直接在 Postgres 中使用标准 SQL 查询 ClickHouse 数据。这意味着您的应用程序可以将 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 schema 中:
CREATE SCHEMA organization;
IMPORT FOREIGN SCHEMA "<database_name>" FROM SERVER ch INTO organization;将 <database_name> 替换为创建服务器时所使用的数据库名称。
现在,您可以在 Postgres 客户端中查看所有 ClickHouse 表:
\实际体验数据分析功能
返回集成页面查看状态。此时初始复制应已完成。点击集成名称可查看详细信息。

点击服务名称,打开 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 (通过 pg_clickhouse) | 加速比 |
|---|---|---|---|
| 热门用户 (5 个聚合) | 555 ms | 164 ms | 3.4x |
| 用户参与度 (JOIN + 聚合) | 1,246 ms | 170 ms | 7.3x |
清理
要删除本快速入门中创建的资源:
- 首先,从 ClickHouse 服务中删除 ClickPipe 集成
- 然后,在 Cloud Console 中删除 ClickHouse Managed Postgres 实例
你可以按这条路径自行操作,把它写成脚本,或交给 AI 智能体处理。如需查看控制台版本,请切换到 Cloud UI 视图。
本页介绍如何仅通过命令行,使用 ClickHouse 命令行客户端 (clickhousectl) 和 psql 完成 ClickHouse Managed Postgres 的预配、数据加载、将数据复制到 ClickHouse 以及查询。命令均为非交互式;clickhousectl 可通过 --json 输出 JSON。
前置条件
安装 ClickHouse 命令行客户端:
curl https://clickhouse.com/cli | sh你还需要 psql (PostgreSQL 客户端工具;在 macOS 上,使用 brew install libpq) 和 jq。
写操作 (创建、删除) 需要通过 API key 身份验证;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、主机名以及可直接使用的连接字符串:
{
"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加载示例数据
创建两个表,并通过 psql 插入 100 万条事件:
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得益于 NVMe 存储,在 m6gd.large (最小规格) 上插入 100 万行数据大约只需 7 秒。可通过查询验证;由于数据是用 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
在 ClickHouse 服务上创建一个 Postgres CDC ClickPipe,并将其指向 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)注意:
- 复制表会落在 ClickHouse 服务的
default数据库中,名称由--table-mapping的目标决定 - publication 和 replication slot 会自动创建,其中 publication 的作用范围仅限于映射的表;传入
--publication-name可改用你自行管理的 publication - 请直接使用 Postgres 主机名;不支持通过 PgBouncer 进行复制
等待管道进入 Running 状态
管道在进入 Running 之前,会依次经过 Provisioning、Setup,以及 (对于较大的表) Snapshot 状态。在一个服务上创建的第一个管道通常需要约 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 中查询复制的数据
直接通过命令行客户端向 ClickHouse 服务执行 SQL。首次调用会自动预配一个 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'...
1000000Postgres 中的新写入会持续复制。插入一行,然后轮询,直到计数达到 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从 Postgres 查询 ClickHouse
pg_clickhouse 扩展可让 Postgres 作为事务型数据和分析型数据的统一查询层。获取 ClickHouse 的 HTTPS 主机名,然后通过 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;
SQL这里特意不给 heredoc 加引号,这样 shell 就会在 SQL 到达 Postgres 之前先替换 $CH_HOST 和 $CH_PASSWORD。现在,这些复制表会在 organization schema 中显示为 foreign tables;对它们发起的查询实际上会在 ClickHouse 中执行。
在使用该数据集的 m6gd.large 上测得,通过 foreign tables 运行分析查询的速度可提升 6-9 倍 (例如,一个包含 5 个聚合的 GROUP BY:通过 ClickHouse 为 176 ms,本地执行为 1,133 ms;一个带聚合的 JOIN:298 ms,而本地为 2,764 ms) 。
清理
请先删除 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"