这些设置可在 system.settings 中找到,并由 源代码 自动生成。
optimize_aggregators_of_group_by_keys
消除 SELECT 部分中对 GROUP BY 键使用的 min/max/any/anyLast 聚合函数
optimize_append_index
使用 约束 来附加索引条件。默认值为 false。
可能的值:
- true, false
optimize_arithmetic_operations_in_aggregate_functions
将算术运算移到聚合函数之外
optimize_const_name_size
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 25.11 | 256 | 替换为标量,并对较大的常量使用哈希作为名称(大小按名称长度估算) |
替换为标量,并对较大的常量使用哈希作为名称 (大小按名称长度估算) 。
可能的取值:
- 正整数 - 名称的最大长度,
- 0 — 始终,
- 负整数 - 从不。
optimize_count_from_files
启用或禁用针对不同输入格式文件的行数统计优化。适用于表函数/引擎 file/s3/url/hdfs/azureBlobStorage。
可能的值:
- 0 — 禁用优化。
- 1 — 启用优化。
optimize_dictget_tuple_element
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 26.5 | 1 | 将 tupleElement(dictGet(..., tuple_of_attrs, ...), N) 改写为单属性 dictGet 调用。 |
将 tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2) 改写为 dictGet('dict', 'b', key),以避免拉取不必要的字典属性。支持按位置 (.1、.2、…) 和按名称 (.b) 访问,也适用于 dictGetOrDefault,前提是默认参数为常量 Tuple 或由常量组成的 tuple(...)。
optimize_distinct_in_order
如果 DISTINCT 中的某些列构成排序前缀,则启用 DISTINCT 优化。例如,MergeTree 中 sorting key 的前缀,或 ORDER BY 语句中的前缀。
optimize_distributed_group_by_sharding_key
通过避免在发起服务器上执行高开销的聚合,优化 GROUP BY sharding_key 查询 (这将降低该查询在发起服务器上的内存使用) 。
支持以下类型的查询 (以及它们的任意组合) :
SELECT DISTINCT [..., ]sharding_key[, ...] FROM distSELECT ... FROM dist GROUP BY sharding_key[, ...]SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY xSELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x
不支持以下类型的查询 (其中部分查询后续可能会增加支持) :
SELECT ... GROUP BY sharding_key[, ...] WITH TOTALSSELECT ... GROUP BY sharding_key[, ...] WITH ROLLUPSELECT ... GROUP BY sharding_key[, ...] WITH CUBESELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1
可能的值:
- 0 — 禁用。
- 1 — 启用。
另请参见:
optimize_dry_run_check_part
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 26.2 | 1 | 新设置 |
启用后,OPTIMIZE ... DRY RUN 会使用 checkDataPart 对生成的合并后分片进行校验。如果校验失败,则会抛出异常。
optimize_empty_string_comparisons
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 25.10 | 1 | 新设置。 |
仅当 col 为 String 或 FixedString 类型时,才会将 col = '' 或 '' = col 之类的表达式转换为 empty(col),并将 col != '' 或 '' != col 转换为 notEmpty(col)。
optimize_extract_common_expressions
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 25.1 | 1 | 通过从析取的合取项中提取公共表达式来优化 WHERE、PREWHERE、ON、HAVING 和 QUALIFY 表达式。 |
| 24.12 | 0 | 引入此设置,用于通过从析取的合取项中提取公共表达式来优化 WHERE、PREWHERE、ON、HAVING 和 QUALIFY 表达式。 |
允许在 WHERE、PREWHERE、ON、HAVING 和 QUALIFY 表达式中从析取项里提取公共表达式。像 (A AND B) OR (A AND C) 这样的逻辑表达式可以改写为 A AND (B OR C),这可能有助于利用:
- 简单筛选表达式中的索引
- CROSS 到 INNER JOIN 的优化
optimize_functions_to_subcolumns
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 24.8 | 1 | 默认启用 |
通过将某些函数优化为读取子列,启用或禁用相关优化。这可以减少需要读取的数据量。
可进行此类转换的函数包括:
- length 优化为读取 size0 子列。
- empty 优化为读取 size0 子列。
- notEmpty 优化为读取 size0 子列。
- isNull 优化为读取 null 子列。
- isNotNull 优化为读取 null 子列。
- count 优化为读取 null 子列。
- mapKeys 优化为读取 keys 子列。
- mapValues 优化为读取 values 子列。
Possible values:
- 0 — 禁用优化。
- 1 — 启用优化。
optimize_inverse_dictionary_lookup
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 25.12 | 1 | 新增设置 |
通过更快地查找预先计算出的可能键值集合,避免重复进行反向字典查找。
optimize_multiif_to_if
将仅包含一个条件的 multiIf 替换为 if。
optimize_normalize_count_variants
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 21.3 | 1 | 默认将语义上等价于 count() 的聚合函数重写为 count() |
将语义上等价于 count() 的聚合函数重写为 count()。
optimize_on_insert
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 21.1 | 1 | 默认在 INSERT 时启用数据优化,以提供更好的用户体验 |
启用或禁用在插入前对数据进行转换,其效果相当于已对该块执行了合并 (具体取决于表引擎) 。
可能的值:
- 0 — 禁用。
- 1 — 启用。
示例
启用与禁用的区别:
查询:
SET optimize_on_insert = 1;
CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable;
INSERT INTO test1 SELECT number % 2 FROM numbers(5);
SELECT * FROM test1;
SET optimize_on_insert = 0;
CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable;
INSERT INTO test2 SELECT number % 2 FROM numbers(5);
SELECT * FROM test2;结果:
┌─FirstTable─┐
│ 0 │
│ 1 │
└────────────┘
┌─SecondTable─┐
│ 0 │
│ 0 │
│ 0 │
│ 1 │
│ 1 │
└─────────────┘请注意,此设置项会影响 materialized view 的行为。
optimize_prewhere_after_pushdown
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 26.6 | 0 | 启用第二轮 PREWHERE 提升的新设置,用于将后续优化(如通过 JOIN 的谓词下推、投影重写)在 MergeTree 读取步骤上方产生的过滤器合并到现有的 PREWHERE 链中。 |
在后续查询计划优化可能已在 MergeTree 读取步骤上方
产生额外过滤器 (例如通过 JOIN 的谓词下推、
投影重写) 后,执行第二轮 PREWHERE 提升。若已存在 PREWHERE,新的
过滤器会通过 AND 合并到其中,而不是保留为单独的过滤器步骤。
optimize_qbit_distance_function_reads
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 25.10 | 1 | 新设置 |
将 QBit 数据类型上的距离函数替换为等效函数,后者仅从存储中读取计算所需的列。
optimize_read_in_order
启用 SELECT 查询中的 ORDER BY 优化,以便从 MergeTree 表中读取数据。
可能的值:
- 0 —
ORDER BY优化已禁用。 - 1 —
ORDER BY优化已启用。
另请参见
optimize_respect_aliases
如果将其设置为 true,则会在 WHERE/GROUP BY/ORDER BY 中识别别名,这将有助于分区裁剪/次级索引/optimize_aggregation_in_order/optimize_read_in_order/optimize_trivial_count
optimize_sorting_by_input_stream_properties
根据输入流的排序属性优化排序
optimize_substitute_columns
使用约束来替换列。默认值为 false。
可选值:
- true, false
optimize_syntax_fuse_functions
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 26.3 | 1 | 该优化已达到生产可用状态 |
启用将具有相同参数的聚合函数融合。它会将包含至少两个参数相同的 sum、count 或 avg 聚合函数的查询重写为 sumCount。
可能的值:
- 0 — 不融合参数相同的函数。
- 1 — 融合参数相同的函数。
示例
查询:
CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log;
SET optimize_syntax_fuse_functions = 1;
EXPLAIN SYNTAX run_query_tree_passes = 1 SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSVRaw;结果:
SELECT
sum(__table1.a) AS `sum(a)`,
tupleElement(sumCount(__table1.b), 1) AS `sum(b)`,
tupleElement(sumCount(__table1.b), 2) AS `count(b)`,
divide(tupleElement(sumCount(__table1.b), 1), toFloat64(tupleElement(sumCount(__table1.b), 2))) AS `avg(b)`
FROM default.fuse_tbl AS __table1optimize_throw_if_noop
启用或禁用以下行为:如果 OPTIMIZE 查询未执行合并,则抛出异常。
默认情况下,即使 OPTIMIZE 没有执行任何操作,也会成功返回。此设置可让您区分这些情况,并在异常消息中获取原因。
可能的值:
- 1 — 启用抛出异常。
- 0 — 禁用抛出异常。
optimize_time_filter_with_preimage
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 24.2 | 1 | 通过将函数改写为无需转换的等效比较来优化 Date 和 日期时间 谓词(例如 toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31') |
通过将函数改写为无需转换的等效比较来优化 Date 和 日期时间 谓词 (例如 toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')
optimize_truncate_order_by_after_group_by_keys
版本历史
| 版本 | 默认值 | 注释 |
|---|---|---|
| 26.4 | 1 | 当 ORDER BY 前缀已覆盖所有 GROUP BY 键时,移除 ORDER BY 末尾的多余元素。 |
当 ORDER BY 前缀已覆盖所有 GROUP BY 键时,移除 ORDER BY 末尾的多余元素。
optimize_uniq_to_count
如果子查询包含 distinct 或 GROUP BY 子句,则将 uniq 及其各种变体 (uniqUpTo 除外) 改写为 count。
optimize_using_constraints
使用约束进行查询优化。默认值为 false。
可能的值:
- true, false