> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# min_* 会话设置

> ClickHouse 中 min_* 自动生成组的会话设置。

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](/docs/zh/reference/system-tables/settings) 中查看，并由 [源代码](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp) 自动生成。

<div id="min_chunk_bytes_for_parallel_parsing">
  ## min\_chunk\_bytes\_for\_parallel\_parsing
</div>

<SettingsInfoBlock type="NonZeroUInt64" default_value="10485760" />

* 类型：无符号整数
* 默认值：1 MiB

每个线程并行解析时的最小分块大小 (以字节为单位) 。

<div id="min_compress_block_size">
  ## min\_compress\_block\_size
</div>

<SettingsInfoBlock type="UInt64" default_value="65536" />

用于 [MergeTree](/docs/zh/reference/engines/table-engines/mergetree-family/mergetree) 表。为了降低查询处理延迟，在写入下一个标记时，如果某个块的大小至少达到 `min_compress_block_size`，就会对该块进行压缩。默认值为 65,536。

如果未压缩数据小于 `max_compress_block_size`，则块的实际大小不会小于该值，也不会小于一个标记对应的数据量。

我们来看一个示例。假设在创建表时将 `index_granularity` 设为 8192。

假设我们写入的是一个 UInt32 类型的列 (每个值 4 字节) 。写入 8192 行时，总数据量为 32 KB。由于 min\_compress\_block\_size = 65,536，因此每两个标记会形成一个压缩块。

假设我们写入的是一个 String 类型的 URL 列 (每个值平均 60 字节) 。写入 8192 行时，平均数据量会略小于 500 KB。由于这大于 65,536，因此每个标记都会形成一个压缩块。在这种情况下，从磁盘读取单个标记范围内的数据时，不会额外解压其他数据。

<Note>
  这是一个专家级设置；如果你刚开始使用 ClickHouse，不建议修改它。
</Note>

<div id="min_filtered_ratio_for_lazy_final">
  ## min\_filtered\_ratio\_for\_lazy\_final
</div>

<SettingsInfoBlock type="Float" default_value="0.5" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.4"},{"label": "0.5"},{"label": "用于使 lazy FINAL 优化继续执行的最小过滤标记比例的新设置"}]}]} />

通过索引分析为 lazy FINAL 优化过滤掉的标记的最小比例。如果过滤掉的标记比例低于此值，则回退到普通 FINAL。值 `0` 会禁用此检查。

<div id="min_hit_rate_to_use_consecutive_keys_optimization">
  ## min\_hit\_rate\_to\_use\_consecutive\_keys\_optimization
</div>

<SettingsInfoBlock type="Float" default_value="0.5" />

在聚合中使用连续键优化时，为保持其启用状态，缓存所需的最低命中率

<div id="min_os_cpu_wait_time_ratio_to_throw">
  ## min\_os\_cpu\_wait\_time\_ratio\_to\_throw
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.5"},{"label": "0"},{"label": "设置值已更改，并已回移到 25.4"}]}, {"id": "row-2","items": [{"label": "25.4"},{"label": "0"},{"label": "新增设置"}]}]} />

开始考虑拒绝查询时，OS CPU 等待时间 (`OSCPUWaitMicroseconds` 指标) 与忙碌时间 (`OSCPUVirtualTimeMicroseconds` 指标) 之间的最小比率。概率通过最小比率与最大比率之间的线性插值计算；当比率处于该值时，概率为 0。

<div id="min_outstreams_per_resize_after_split">
  ## min\_outstreams\_per\_resize\_after\_split
</div>

<SettingsInfoBlock type="UInt64" default_value="24" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.6"},{"label": "24"},{"label": "新设置。"}]}]} />

指定在管道生成期间执行拆分后，`Resize` 或 `StrictResize` 处理器的最少输出流数量。如果生成的流数量小于该值，则不会执行拆分操作。

<div id="what-is-a-resize-node">
  ### 什么是 Resize 节点
</div>

`Resize` 节点是查询管道中的一种处理器，用于调整管道中数据流的数量。它既可以增加流的数量，也可以减少流的数量，从而在多个线程或处理器之间平衡工作负载。例如，如果查询需要更高的并行度，`Resize` 节点可以将单个 stream 拆分为多个流。反过来，它也可以将多个流合并为更少的流，以集中处理数据。

`Resize` 节点可确保数据在各个流之间均匀分布，同时保持数据块的结构。这有助于优化资源利用率并提升查询性能。

<div id="why-the-resize-node-needs-to-be-split">
  ### 为什么需要拆分 Resize 节点
</div>

在管道执行过程中，作为中心枢纽的 `Resize` 节点，其 ExecutingGraph::Node::status\_mutex 会出现严重争用，尤其是在高核数环境下。这种争用会导致：

1. ExecutingGraph::updateNode 的延迟升高，直接影响查询性能。
2. 大量 CPU 周期浪费在自旋锁争用 (native\_queued\_spin\_lock\_slowpath) 上，降低整体效率。
3. CPU 利用率下降，限制并行度和吞吐量。

<div id="how-the-resize-node-gets-split">
  ### Resize 节点如何拆分
</div>

1. 首先会检查输出流数量，以确保可以执行拆分：每个拆分后处理器的输出流都必须达到或超过 `min_outstreams_per_resize_after_split` 阈值。
2. `Resize` 节点会被拆分为多个更小的 `Resize` 节点，这些节点的端口数量相同，每个节点分别处理一部分输入流和输出流。
3. 各组会独立处理，从而减少锁竞争。

<div id="splitting-resize-node-with-arbitrary-inputsoutputs">
  ### 拆分具有任意输入/输出的 Resize 节点
</div>

在某些情况下，如果输入/输出的数量无法被拆分后的 `Resize` 节点数整除，就会将部分输入连接到 `NullSource`，并将部分输出连接到 `NullSink`。这样就能在不影响整体数据流的情况下完成拆分。

<div id="purpose-of-the-setting">
  ### 设置的用途
</div>

`min_outstreams_per_resize_after_split` 设置可确保对 `Resize` 节点进行拆分是有意义的，并避免生成过少的流，因为这可能导致并行处理效率低下。通过强制设定输出流的最小数量，该设置有助于在并行度与开销之间保持平衡，从而在涉及流拆分与合并的场景中优化查询执行。

<div id="disabling-the-setting">
  ### 禁用该设置
</div>

要禁用对 `Resize` 节点的拆分，请将此设置设为 0。这样会阻止在管道生成期间拆分 `Resize` 节点，使其保留原有结构，而不会被拆分为更小的节点。

<div id="min_table_rows_to_use_projection_index">
  ## min\_table\_rows\_to\_use\_projection\_index
</div>

<SettingsInfoBlock type="UInt64" default_value="1000000" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "1000000"},{"label": "新增设置"}]}]} />

如果预计需要从表中读取的行数大于或等于此阈值，ClickHouse 会在执行查询时尝试使用投影索引。
