警告

多节点支持已弃用.

TimescaleDB v2.13 是最后一个为 PostgreSQL 版本 13、14 和 15 提供多节点支持的版本。

您可以使用 INSERT 语句将数据插入到分布式超表。语法与标准超表或 PostgreSQL 表的语法相同。例如

INSERT INTO conditions(time, location, temperature, humidity)
VALUES (NOW(), 'office', 70.0, 50.0);

分布式超表比标准超表具有更高的网络负载,因为它们必须将插入操作从访问节点推送到数据节点。您可以优化插入模式以减少负载。

通过批量处理多个数据行的 INSERT 语句来减少负载,而不是将每次插入作为单独的事务执行。

访问节点首先通过确定每行数据应属于哪个数据节点,将批处理数据拆分为更小的批次。然后,它将每个批次写入正确的数据节点。

当插入到分布式超表时,访问节点会尝试将 INSERT 语句转换为访问节点和数据节点之间更高效的 COPY 操作。但这在以下情况下不起作用:

  • INSERT 语句具有 RETURNING 子句并且
  • 超表具有可能更改返回数据的触发器

在这种情况下,计划器使用多行预处理语句插入到每个数据节点中。它将原始插入语句拆分到这些子语句中。您可以通过在 INSERT 语句上运行 EXPLAIN 来查看计划。

在预处理语句中,访问节点可以在刷新到数据节点之前缓冲多行。默认情况下,数量为 1000。您可以通过更改 timescaledb.max_insert_batch_size 设置来优化此值,例如减少必须发送的单独批次的数量。

最大批次大小有一个上限。这等于预处理语句中允许的最大参数数量(当前为 32,767 个参数),除以每行中的列数。例如,如果您有一个包含 10 列的分布式超表,则您可以设置的最大批次大小为 3276。

有关更改 timescaledb.max_insert_batch_size 的更多信息,请参阅有关配置的部分。

COPY 在分布式超表上可能比 INSERT 性能更好。但它不支持某些功能,例如使用 ON CONFLICT 子句的冲突处理。

要从文件复制到超表,请运行

COPY <HYPERTABLE> FROM '<FILE_PATH>';

在执行 COPY 时,访问节点会将每个数据节点切换到复制模式。然后,它将每行流式传输到正确的数据节点。

关键词

在此页面上发现问题?报告问题 或 在 GitHub 上编辑此页