ClickHouse:操作执行中使用insert into...select是否会复制新增数据?
ClickHouse中
INSERT INTO ... SELECT的数据复制规则 核心问题解答
问题1:ClickHouse是否会通过INSERT INTO ... SELECT复制新数据?
默认情况下,INSERT INTO ... SELECT会基于查询执行开始时刻的数据快照读取源表内容,只会复制语句启动时已存在且提交完成的数据,不会包含语句执行过程中新增的数据。
这是因为ClickHouse默认采用**快照隔离(Snapshot Isolation)**级别:查询启动时会生成一个数据快照,整个查询周期都基于该快照读取,不受并发写入操作的干扰。
问题2:当已有操作正在执行时,INSERT INTO ... SELECT是否会复制新增的数据?
不会。即使在INSERT INTO ... SELECT执行期间,有其他写入操作(如另一个INSERT)向源表新增数据,这些后续写入的数据也不会被当前语句读取到。
本质还是快照隔离机制的作用:查询启动时的快照固定了数据范围,后续新增的数据属于快照之后的版本,不会被纳入当前查询的结果集。
补充说明:ClickHouse隔离级别细节
ClickHouse主要支持两种隔离级别:
- 快照隔离(默认):所有查询基于启动时刻的快照,读不阻塞写、写不阻塞读,避免脏读、不可重复读问题。
- 读已提交(Read Committed):可通过设置
settings allow_read_committed = 1启用,此时查询会读取最新已提交数据,但可能出现不可重复读。不过即使启用该级别,INSERT INTO ... SELECT仍基于查询启动时的快照执行——这类批量操作需要保证数据一致性,不会实时读取执行过程中的新增数据。
内容的提问来源于stack exchange,提问作者Hett
相关产品推荐
相关产品推荐

