【问题标题】:Insert all rows from one table to another of identical structure将一个表中的所有行插入到另一个具有相同结构的表中
【发布时间】:2019-08-03 22:48:48
【问题描述】:

我正在尝试将表格的所有内容移动到具有相同结构的另一个表格中。有很多行,所以当我尝试像这样执行它时

insert into target_table select * from source_table;

我收到这种错误:

ClickHouse exception, code: 159; Read timed out

我想它会尝试将整个 SELECT 数据加载到 RAM 中,然后将其插入到表中,这在这种情况下是不可能的。有没有一些专门的方法可以做到这一点?

我也不想按小部分循环选择和插入数据。

编辑:我正在寻找 SQL 解决方案。

【问题讨论】:

    标签: insert clickhouse


    【解决方案1】:

    ClickHouse 本身应该正确处理此类查询。

    对于简单的SELECT *,它不需要将整个数据读入内存,它应该以流的方式工作。

    您的客户很可能只是在等待 ClickHouse 确认操作完成时超时。

    所以你有以下选择:

    1. 只需增加您的客户端连接超时时间

    2. 通过多次插入复制数据 - 按某些条件切片数据。

      INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 1 and 10000;
      INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 10001 and 20000;
      ...
      
    3. 使用 MergeTree 族表并且表结构完全相同时,最有效的方法是通过将分区直接从一个表复制到另一个来复制数据

      ALTER TABLE dst_table ATTACH PARTITION '2019-01-01' FROM source_table;
      
      -- you get get the list of partitions like that:
      SELECT partition
         FROM system.parts
         WHERE database = '...' and table = 'source_table' and active = 1
         GROUP BY partition;
      
    4. 如果您只需要另一个数据副本(例如使用另一个键),您可以使用物化视图自动填充它

      CREATE MATERIALIZED VIEW str2dst TO dest_table AS SELECT * FROM source_table;
      
    5. 如果您需要移动大量数据,尤其是在集群之间 - clickhouse-copier 是最佳选择。

    【讨论】:

      【解决方案2】:

      是的,select-insert 只有在使用小表时才是一个很好的解决方案。
      您可以对大型表使用 clickhouse-copier 将它们移动到集群内或另一个集群。
      阅读它here

      【讨论】:

      • 谢谢,这是一种方法。我的不好我在原帖中没有提到它,但我的情况不是DBA,而是将此操作嵌入程序代码中,所以我正在寻找某种SQL查询,如果可能的话。
      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 2010-10-09
      • 2020-03-11
      • 2019-01-06
      • 2015-03-21
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多