SELECT 和 INSERT 查询。
目前,该表引擎仅支持 PostgreSQL 12 及以上版本。
创建表
- 列名应与原始 PostgreSQL 表中的列名一致,但你也可以只使用其中部分列,且顺序不限。
- 列类型可以与原始 PostgreSQL 表中的不同。ClickHouse 会尝试将值转换为 ClickHouse 数据类型。
- external_table_functions_use_nulls 设置定义了如何处理 Nullable 列。默认值:1。如果为 0,表函数不会创建 Nullable 列,而会插入默认值来代替 null。此规则也适用于数组中的 NULL 值。
host:port— PostgreSQL 服务器地址。database— 远程数据库名称。table— 远程表名,或按原样传递给 PostgreSQL 的查询 (参见传递查询而不是表名) 。user— PostgreSQL 用户。password— 用户密码。schema— 非默认表 schema。可选。on_conflict— 冲突解决策略。示例:ON CONFLICT DO NOTHING。可选。注意:添加此选项会降低插入效率。
设置
PostgreSQL 表引擎 (以及 postgresql 表函数) 使用的连接池可以通过 SETTINGS 子句按表配置。若未指定某项设置,则默认使用对应查询级别 postgresql_* 设置的值。
postgresql_connection_pool_size
16。
postgresql_connection_pool_wait_timeout
0 表示在连接池为空时会阻塞等待。
默认值:5000。
postgresql_connection_pool_retries
2。
postgresql_connection_pool_auto_close_connection
false。
postgresql_connection_attempt_timeout
connect_timeout 参数传递。
默认值:2。
示例:
实现细节
SELECT 查询会在只读的 PostgreSQL 事务中以 COPY (SELECT ...) TO STDOUT 的形式运行,并在每次 SELECT 查询后提交。
简单的 WHERE 子句,如 =, !=, >, >=, <, <= 和 IN,会在 PostgreSQL 服务器上执行。
所有 JOIN、聚合、排序、IN [ array ] 条件以及 LIMIT 采样约束,都只会在对 PostgreSQL 的查询结束后于 ClickHouse 中执行。
传递查询而不是表名
table 参数可以不是表名,而是一个按原样传递给 PostgreSQL 的 SELECT 查询。表的结构会从查询结果中推断出来。该查询既可以写成子查询,也可以包装在 query 函数中:
INSERT。postgresql 表函数也支持相同的语法。
子查询形式
(SELECT ...) 会由 ClickHouse 解析,并在发送到服务器之前按 PostgreSQL 方言重新序列化 (包括 PostgreSQL 标识符引用和字符串字面量转义) 。因此,它必须是有效的 ClickHouse SQL。若要传递 ClickHouse 不会解析的 PostgreSQL 特有语法,请使用 query('...') 形式,其文本会原样发送到 PostgreSQL。周围 ClickHouse 查询中的任何外层 WHERE、LIMIT、聚合等,都不会下推到传入的查询中,而是在拉取完整查询结果后由 ClickHouse 应用。要限制从 PostgreSQL 读取的数据,请将过滤器放在传入的查询内部。使用 external_table_strict_query = 1 时,无法下推的外层过滤器会直接抛出异常,而不是在本地应用。INSERT 查询会在 PostgreSQL 事务中以 COPY "table_name" (field1, field2, ... fieldN) FROM STDIN 的形式运行,并在每条 INSERT 语句后自动提交。
PostgreSQL 的 Array 类型会转换为 ClickHouse 数组。
请注意:在 PostgreSQL 中,以
type_name[] 形式创建的数组数据,可能会在同一列的不同行中包含维度数量不同的多维数组。但在 ClickHouse 中,同一列的所有表行只允许使用维度数量相同的多维数组。| 列出。例如:
0。
在下面的示例中,副本 example01-1 的优先级最高: