materialized_views_ignore_errors
SELECT 中还是在内部表 sink 中) 抛出的异常会作为警告记录,且 INSERT 语句会成功。如果禁用 (默认) ,这类异常会继续向上传播,且 INSERT 语句会失败。
此设置仅控制错误报告。它不会回滚对源表的写入,也不保证当依赖视图的管道中发生错误时,原始块是否已提交到源表。禁用时 (默认) ,INSERT 会因视图错误而失败——请结合插入去重 (insert_deduplicate、deduplicate_blocks_in_dependent_materialized_views) 重试,以便对源表和所有依赖视图实现 exactly-once 传递。启用时,即使失败视图及其下游链只完成了部分传递,INSERT 仍会报告成功;仅应在源表写入绝不能被视图侧问题阻塞时使用此设置 (例如 system.*_log 表) 。完整语义请参阅 CREATE VIEW 文档。
materialized_views_populate_atomically
CREATE MATERIALIZED VIEW ... POPULATE 具备原子性:在源表上短暂持有排他锁期间,视图订阅源表的新插入,同时获取现有数据的快照,因此在填充期间并发插入的每一行都会恰好一次写入视图 (既不会遗漏,也不会重复) 。随后,可能长时间运行的填充过程会读取固定快照,无需持有任何锁。
这是本地插入路径的原子性:排他锁只会与同一服务器上获取该源表存储锁的插入操作串行执行,因此“恰好一次”保证仅涵盖通过该服务器到达的插入。这并非集群级保证——在填充期间,并发插入到 ReplicatedMergeTree 源表其他副本的行,或经由分布式写入路径 (例如写入 Distributed 表或通过 ON CLUSTER) 插入的行,仍可能遗漏或重复。
这要求源表支持读取固定的时间点快照 (MergeTree 家族和 Memory) 。对于其他任何源 (视图、Distributed、Merge、Log 家族,或不在 Atomic 数据库中的表) ,填充会回退到旧版非原子行为 (记录在服务器日志中) :现有数据将通过独立且未协调的快照读取,因此填充期间插入的行可能遗漏或重复。将此设置设为 false,可强制所有源使用旧版行为。仅适用于普通 CREATE MATERIALIZED VIEW;CREATE OR REPLACE / REPLACE 始终采用旧版非原子填充,在 Replicated 数据库中创建的视图也是如此 (其中 POPULATE 需要 database_replicated_allow_heavy_create) ,因为填充失败时无法在该数据库的所有副本上进行一致回滚。
materialized_views_squash_parallel_inserts
parallel_view_processing,则 INSERT 查询会为每个 max_insert_thread 在目标表中生成一个 part。