> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# materialized_views_* 会话设置

> ClickHouse 在 materialized_views_* 自动生成分组中的会话设置。

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["版本", "默认值", "注释"];
  const border = "1px solid rgba(128, 128, 128, 0.3)";
  const cell = {
    border,
    padding: "0.25rem 0.5rem",
    textAlign: "start",
    verticalAlign: "top"
  };
  return <details className="not-prose" style={{
    border,
    borderRadius: "0.5rem",
    margin: "0.5rem 0",
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <summary style={{
    cursor: "pointer",
    fontWeight: 600,
    opacity: 0.72
  }}>
        版本历史
      </summary>
      <table style={{
    borderCollapse: "collapse",
    width: "100%",
    margin: "0.5rem 0 0"
  }}>
        <thead>
          <tr>
            {headers.map(header => <th key={header} style={{
    ...cell,
    fontWeight: 600,
    opacity: 0.72
  }}>
                {header}
              </th>)}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, row_index) => <tr key={row.id ?? row_index}>
              {(row.items ?? []).map((item, item_index) => <td key={item_index} style={{
    ...cell,
    overflowWrap: "anywhere"
  }}>
                  {item?.label}
                </td>)}
            </tr>)}
        </tbody>
      </table>
    </details>;
};

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>类型</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>默认值</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          无需重启即可更改
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

这些设置可在 [system.settings](/zh/reference/system-tables/settings) 中查看，并根据 [源代码](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp) 自动生成。

<div id="materialized_views_ignore_errors">
  ## materialized\_views\_ignore\_errors
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

如果启用，将数据推送到依赖的 materialized view 时 (无论是在其 `SELECT` 中还是在内部表 sink 中) 抛出的异常会作为警告记录，且 `INSERT` 语句会成功。如果禁用 (默认) ，这类异常会继续向上传播，且 `INSERT` 语句会失败。

此设置仅控制错误报告。它不会回滚对源表的写入，也不保证当依赖视图的管道中发生错误时，原始块是否已提交到源表。禁用时 (默认) ，`INSERT` 会因视图错误而失败——请结合插入去重 (`insert_deduplicate`、`deduplicate_blocks_in_dependent_materialized_views`) 重试，以便对源表和所有依赖视图实现 exactly-once 传递。启用时，即使失败视图及其下游链只完成了部分传递，`INSERT` 仍会报告成功；仅应在源表写入绝不能被视图侧问题阻塞时使用此设置 (例如 `system.*_log` 表) 。完整语义请参阅 `CREATE VIEW` 文档。

<div id="materialized_views_populate_atomically">
  ## materialized\_views\_populate\_atomically
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "新增设置，使普通 `CREATE MATERIALIZED VIEW ... POPULATE` 在本地具备原子性：在源表上短暂持有排他锁期间，同时对现有数据创建快照并让视图订阅新插入，因此通过同一服务器插入的行既不会遗漏，也不会重复。该保证仅覆盖本地插入路径——到达其他副本或通过分布式写入到达的插入不在此范围内——并且要求源表能够提供固定快照（`MergeTree` 家族和 `Memory`）；其他源以及 `CREATE OR REPLACE` \/ `REPLACE` 仍采用旧版非原子填充。设为 `false` 可对所有源使用旧版非原子行为。"}]}]} />

使 `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`) ，因为填充失败时无法在该数据库的所有副本上进行一致回滚。

<div id="materialized_views_squash_parallel_inserts">
  ## materialized\_views\_squash\_parallel\_inserts
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "添加了此设置，以便在需要时保留旧有行为。"}]}]} />

将单个 INSERT 查询中通过并行插入写入 materialized view 目标表的写入操作合并，以减少生成的 parts 数量。
如果设置为 false 且启用了 `parallel_view_processing`，则 INSERT 查询会为每个 `max_insert_thread` 在目标表中生成一个 part。
