[英]Insert all rows from one table to another of identical structure
我正在嘗試將表的所有內容移動到具有相同結構的另一個表。 有很多行,所以當我嘗試像這樣執行時
insert into target_table select * from source_table;
我收到這種錯誤:
ClickHouse exception, code: 159; Read timed out
我想它嘗試將整個SELECT數據加載到RAM中,然后將其插入表中,在這種情況下是不可能的。 有一些專門的方法可以做到嗎?
我也不想一小部分地選擇和插入數據。
編輯:我正在尋找一個SQL解決方案。
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
是最佳選擇。
是的,僅當使用小表時,選擇插入才是一個好的解決方案。
您可以將clickhouse-copier用於大型表,以將其在群集中或另一個群集中移動。
在這里閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.