将一个表中的所有行插入到另一个结构相同的表中

ezykj2lf  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(2)|浏览(483)

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

insert into target_table select * from source_table;

我犯了这样的错误:

ClickHouse exception, code: 159; Read timed out

我假设它试图将整个select数据加载到ram中,然后将其插入到表中,这在这种情况下是不可能的。有没有一些专门的方法来做到这一点?
我不想选择和插入数据在循环中的一小部分。
编辑:我正在搜索sql解决方案。

irlmq6kh

irlmq6kh1#

clickhouse本身应该正确处理这些查询。
为了简单 SELECT * 它不需要将整个数据读入内存,它应该以流方式工作。
很可能您的客户机只是在等待clickhouse确认操作完成时超时。
因此您有以下选项:
只需增加客户端连接超时
通过多次插入复制数据-根据某些条件切片数据。

INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 1 and 10000;
INSERT INTO xxx SELECT * FROM table WHERE column BETWEEN 10001 and 20000;
...

使用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;

如果您只需要拥有另一个数据副本(例如,使用另一个键),那么您可以使用物化视图自动填充它

CREATE MATERIALIZED VIEW str2dst TO dest_table AS SELECT * FROM source_table;

如果您需要移动大量数据,特别是在群集之间- clickhouse-copier 是最好的选择。

pokxtpni

pokxtpni2#

是的,选择insert只是使用小表时的一个好解决方案。
您可以使用clickhouse copier将大表在群集中移动或移动到另一个群集中。
在这里读一下

相关问题