跳到主要内容
跳到主要内容

PostgreSQL 表引擎

The PostgreSQL engine allows SELECT and INSERT queries on data stored on a remote PostgreSQL server.

备注

当前仅支持 PostgreSQL 版本 12 及以上。

通过 PeerDB 复制或迁移 Postgres 数据

除了 Postgres 表引擎,您还可以使用 PeerDB 来设置从 Postgres 到 ClickHouse 的连续数据管道。PeerDB 是一个专门设计用于通过变更数据捕获 (CDC) 将数据从 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 可用)。以下是示例:

某些参数可以通过键值参数覆盖:

实现细节

PostgreSQL 端的 SELECT 查询作为 COPY (SELECT ...) TO STDOUT 在只读 PostgreSQL 事务中运行,每个 SELECT 查询后都会提交。

简单的 WHERE 子句,例如 =, !=, >, >=, <, <=, 和 IN 在 PostgreSQL 服务器上执行。

所有的连接、聚合、排序、IN [ array ] 条件和 LIMIT 抽样约束仅在对 PostgreSQL 的查询完成后在 ClickHouse 中执行。

PostgreSQL 端的 INSERT 查询作为 COPY "table_name" (field1, field2, ... fieldN) FROM STDIN 在 PostgreSQL 事务中运行,每个 INSERT 语句后都自动提交。

PostgreSQL 的 Array 类型转换为 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 表之间进行同步,您可以在 ClickHouse 中使用 WHERE 子句仅插入基于时间戳或唯一序列 ID 添加到 PostgreSQL 的数据。

这需要跟踪先前添加的最大 ID 或时间戳,例如:

然后插入 PostgreSQL 表中大于最大值的值

从生成的 ClickHouse 表中选择数据

使用非默认模式

另请参见