我正在尝试将表的所有内容移动到具有相同结构的另一个表。有很多行,所以当我尝试像这样执行时
insert into target_table select * from source_table;
我遇到这种错误:
ClickHouse exception, code: 159; Read timed out
我想它尝试将整个SELECT数据加载到RAM中,然后将其插入表中,在这种情况下是不可能的。有一些专门的方法可以做到吗?
我也不想一小部分地选择和插入数据。
编辑:我正在寻找SQL解决方案。
答案 0 :(得分:1)
是的,仅当使用小表时,选择插入才是一个好的解决方案。
您可以将 clickhouse-copier 用于大型表,以将它们移动到群集中或另一个群集中。
阅读有关here
答案 1 :(得分:1)
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;
如果您只需要拥有另一个数据副本(例如,使用另一个键),则可以自动用Materialized视图填充它
CREATE MATERIALIZED VIEW str2dst TO dest_table AS SELECT * FROM source_table;
如果您需要在群集之间移动大量数据-clickhouse-copier
是最佳选择。