MergeTree 表设置
系统表 system.merge_tree_settings
显示全局设置的 MergeTree 设置。
MergeTree 设置可以在服务器配置文件的 merge_tree
部分设置,或者在 CREATE TABLE
语句的 SETTINGS
子句中为每个 MergeTree
表单独指定。
自定义设置 max_suspicious_broken_parts
的示例
在服务器配置文件中配置所有 MergeTree
表的默认值
<merge_tree>
<max_suspicious_broken_parts>5</max_suspicious_broken_parts>
</merge_tree>
为特定表设置
CREATE TABLE tab
(
`A` Int64
)
ENGINE = MergeTree
ORDER BY tuple()
SETTINGS max_suspicious_broken_parts = 500;
使用 ALTER TABLE ... MODIFY SETTING
更改特定表的设置
ALTER TABLE tab MODIFY SETTING max_suspicious_broken_parts = 100;
-- reset to global default (value from system.merge_tree_settings)
ALTER TABLE tab RESET SETTING max_suspicious_broken_parts;
index_granularity
索引标记之间的数据行最大数量。
默认值:8192。
index_granularity_bytes
数据颗粒的最大大小(以字节为单位)。
默认值:10Mb。
要仅通过行数限制颗粒大小,请设置为 0(不建议)。
min_index_granularity_bytes
允许的最小数据颗粒大小(以字节为单位)。
默认值:1024b。
提供保护,防止意外创建具有非常低的 index_granularity_bytes 的表。
enable_mixed_granularity_parts
启用或禁用转换以使用 index_granularity_bytes
设置控制颗粒大小。在 19.11 版本之前,只有 index_granularity
设置用于限制颗粒大小。index_granularity_bytes
设置在从具有大行(数十兆字节和数百兆字节)的表中选择数据时,可以提高 ClickHouse 的性能。如果您有具有大行的表,可以为这些表启用此设置,以提高 SELECT
查询的效率。
use_minimalistic_part_header_in_zookeeper
在 ZooKeeper 中存储数据部分头部的存储方法。如果启用,ZooKeeper 将存储更少的数据。有关详细信息,请参阅 此处。
min_merge_bytes_to_use_direct_io
使用直接 I/O 访问存储磁盘所需的合并操作的最小数据量。在合并数据部分时,ClickHouse 会计算所有要合并数据的总存储量。如果该体积超过 min_merge_bytes_to_use_direct_io
字节,ClickHouse 将使用直接 I/O 接口(O_DIRECT
选项)读取和写入存储磁盘上的数据。如果 min_merge_bytes_to_use_direct_io = 0
,则禁用直接 I/O。
默认值:10 * 1024 * 1024 * 1024
字节。
merge_with_ttl_timeout
重复执行具有删除 TTL 的合并之前的最小延迟(以秒为单位)。
默认值:14400
秒(4 小时)。
merge_with_recompression_ttl_timeout
重复执行具有重新压缩 TTL 的合并之前的最小延迟(以秒为单位)。
默认值:14400
秒(4 小时)。
write_final_mark
启用或禁用在数据部分的末尾(最后一个字节之后)写入最终索引标记。
默认值:1。
不要更改或将发生不好的事情。
storage_policy
存储策略。
min_bytes_for_wide_part
可以以 Wide
格式存储的数据部分中的最小字节/行数。您可以设置其中一个、两个或都不设置。
max_compress_block_size
在压缩以写入表之前,未压缩数据的块的最大大小。您也可以在全局设置中指定此设置(请参阅 max_compress_block_size 设置)。在创建表时指定的 value 将覆盖此设置的全局 value。
min_compress_block_size
写入下一个标记时,压缩所需的未压缩数据块的最小大小。您也可以在全局设置中指定此设置(请参阅 min_compress_block_size 设置)。在创建表时指定的 value 将覆盖此设置的全局 value。
max_suspicious_broken_parts
如果单个分区中损坏的部分数量超过 max_suspicious_broken_parts
value,则拒绝自动删除。
可能的 value
- 任何正整数。
默认值:100。
parts_to_throw_insert
如果单个分区中活动部分的数量超过 parts_to_throw_insert
value,INSERT
将被中断,并显示 Too many parts (N). Merges are processing significantly slower than inserts
异常。
可能的 value
- 任何正整数。
默认值:3000。
为了实现 SELECT
查询的最大性能,必须尽量减少处理的部分数量,请参阅 Merge Tree。
在 23.6 之前,此设置设置为 300。您可以设置更高的不同 value,它将减少出现 Too many parts
错误的可能性,但同时 SELECT
性能可能会下降。此外,在合并出现问题的情况下(例如,由于磁盘空间不足),您将在比原始 300 延迟更长的时间后才能注意到它。
parts_to_delay_insert
如果单个分区中活动部分的数量超过 parts_to_delay_insert
value,则 INSERT
将人为地减速。
可能的 value
- 任何正整数。
默认值:1000。
ClickHouse 人为地执行 INSERT
更长时间(添加“睡眠”),以便后台合并过程可以比添加部分的速度更快地合并部分。
inactive_parts_to_throw_insert
如果单个分区中非活动部分的数量超过 inactive_parts_to_throw_insert
value,INSERT
将被中断,并显示“Too many inactive parts (N). Parts cleaning are processing significantly slower than inserts”异常。
可能的 value
- 任何正整数。
默认值:0(无限制)。
inactive_parts_to_delay_insert
如果表中单个分区中的非活动部分数量至少与 inactive_parts_to_delay_insert
value 相同,则 INSERT
会人为地减速。当服务器无法及时清除部分时,这很有用。
可能的 value
- 任何正整数。
默认值:0(无限制)。
max_delay_to_insert
以秒为单位的 value,用于计算 INSERT
延迟,如果单个分区中活动部分的数量超过 parts_to_delay_insert value。
可能的 value
- 任何正整数。
默认值:1。
INSERT
的延迟(以毫秒为单位)由以下公式计算:
max_k = parts_to_throw_insert - parts_to_delay_insert
k = 1 + parts_count_in_partition - parts_to_delay_insert
delay_milliseconds = pow(max_delay_to_insert * 1000, k / max_k)
例如,如果一个分区有 299 个活动部分,并且 parts_to_throw_insert = 300,parts_to_delay_insert = 150,max_delay_to_insert = 1,那么 INSERT
将延迟 pow( 1 * 1000, (1 + 299 - 150) / (300 - 150) ) = 1000
毫秒。
从 23.1 版本开始,公式已更改为
allowed_parts_over_threshold = parts_to_throw_insert - parts_to_delay_insert
parts_over_threshold = parts_count_in_partition - parts_to_delay_insert + 1
delay_milliseconds = max(min_delay_to_insert_ms, (max_delay_to_insert * 1000) * parts_over_threshold / allowed_parts_over_threshold)
例如,如果一个分区有 224 个活动部分,并且 parts_to_throw_insert = 300,parts_to_delay_insert = 150,max_delay_to_insert = 1,min_delay_to_insert_ms = 10,那么 INSERT
将延迟 max( 10, 1 * 1000 * (224 - 150 + 1) / (300 - 150) ) = 500
毫秒。
max_parts_in_total
如果表中所有分区中活动部分的总数超过 max_parts_in_total
值,则 INSERT
将被 Too many parts (N)
异常中断。
可能的 value
- 任何正整数。
默认值:100000。
表中大量部分会降低 ClickHouse 查询的性能并增加 ClickHouse 启动时间。这通常是设计不当(选择分区策略时出错 - 分区过小)的结果。
simultaneous_parts_removal_limit
如果存在大量过时部分,清理线程将尝试在一次迭代中删除多达 simultaneous_parts_removal_limit
个部分。将 simultaneous_parts_removal_limit
设置为 0
表示无限制。
默认值:0。
replicated_deduplication_window
ClickHouse Keeper 存储哈希总和以检查重复的最近插入块的数量。
可能的 value
- 任何正整数。
- 0(禁用重复数据删除)
默认值:1000。
Insert
命令创建了一个或多个块(部分)。对于 插入重复数据删除,在写入复制表时,ClickHouse 会将创建的部分的哈希总和写入 ClickHouse Keeper。哈希总和仅存储在最近的 replicated_deduplication_window
个块中。最旧的哈希总和将从 ClickHouse Keeper 中删除。大量的 replicated_deduplication_window
会减慢 Inserts
,因为它需要比较更多的条目。哈希总和是从字段名称和类型的组合以及插入部分的数据(字节流)计算出来的。
non_replicated_deduplication_window
非复制 MergeTree 表中最近插入块的数量,用于存储哈希总和以检查重复项。
可能的 value
- 任何正整数。
- 0(禁用重复数据删除)。
默认值:0。
使用与复制表类似的重复数据删除机制(参见 replicated_deduplication_window 设置)。创建的部分的哈希总和将写入磁盘上的本地文件。
replicated_deduplication_window_seconds
删除插入块的哈希总和从 ClickHouse Keeper 中删除的秒数。
可能的 value
- 任何正整数。
默认值:604800(1 周)。
类似于 replicated_deduplication_window,replicated_deduplication_window_seconds
指定存储插入重复数据删除块的哈希总和的时间长度。比 replicated_deduplication_window_seconds
更旧的哈希总和将从 ClickHouse Keeper 中删除,即使它们小于 replicated_deduplication_window
。
时间相对于最新记录的时间,而不是相对于墙时间。如果它是唯一的记录,它将永远存储。
replicated_deduplication_window_for_async_inserts
ClickHouse Keeper 存储哈希总和以检查重复的最近异步插入块的数量。
可能的 value
- 任何正整数。
- 0(禁用异步插入的重复数据删除)
默认值:10000。
The Async Insert 命令将缓存在一个或多个块(部分)中。对于 插入重复数据删除,在写入复制表时,ClickHouse 会将每个插入的哈希总和写入 ClickHouse Keeper。哈希总和仅存储在最近的 replicated_deduplication_window_for_async_inserts
个块中。最旧的哈希总和将从 ClickHouse Keeper 中删除。大量的 replicated_deduplication_window_for_async_inserts
会减慢 Async Inserts
,因为它需要比较更多的条目。哈希总和是从字段名称和类型的组合以及插入的数据(字节流)计算出来的。
replicated_deduplication_window_seconds_for_async_inserts
删除异步插入的哈希总和从 ClickHouse Keeper 中删除的秒数。
可能的 value
- 任何正整数。
默认值:604800(1 周)。
类似于 replicated_deduplication_window_for_async_inserts,replicated_deduplication_window_seconds_for_async_inserts
指定存储异步插入重复数据删除块的哈希总和的时间长度。比 replicated_deduplication_window_seconds_for_async_inserts
更旧的哈希总和将从 ClickHouse Keeper 中删除,即使它们小于 replicated_deduplication_window_for_async_inserts
。
时间相对于最新记录的时间,而不是相对于墙时间。如果它是唯一的记录,它将永远存储。
use_async_block_ids_cache
如果为真,我们将缓存异步插入的哈希总和。
可能的 value
- true,false
默认值:false。
包含多个异步插入的块将生成多个哈希总和。当某些插入重复时,Keeper 将在一次 RPC 中仅返回一个重复的哈希总和,这将导致不必要的 RPC 重试。此缓存将监视 Keeper 中的哈希总和路径。如果在 Keeper 中监视到更新,则缓存将尽快更新,以便我们能够在内存中过滤重复的插入。
async_block_ids_cache_min_update_interval_ms
更新 use_async_block_ids_cache
的最小间隔(毫秒)。
可能的 value
- 任何正整数。
默认值:100。
通常,use_async_block_ids_cache
在监视的 Keeper 路径中有更新时立即更新。但是,缓存更新可能过于频繁,并成为沉重的负担。此最小间隔可以防止缓存更新过快。请注意,如果我们将此值设置得太长,包含重复插入的块将具有更长的重试时间。
max_replicated_logs_to_keep
如果存在非活动副本,ClickHouse Keeper 日志中可以有多少条记录。当此数字超过时,非活动副本将丢失。
可能的 value
- 任何正整数。
默认值:1000
min_replicated_logs_to_keep
保留 ZooKeeper 日志中大约这个数量的最后几条记录,即使它们已过时。它不会影响表的正常工作:仅用于在清理之前诊断 ZooKeeper 日志。
可能的 value
- 任何正整数。
默认值:10
prefer_fetch_merged_part_time_threshold
如果复制日志(ClickHouse Keeper 或 ZooKeeper)条目创建后的经过时间超过此阈值,并且部分大小的总和大于 prefer_fetch_merged_part_size_threshold
,则优先从副本中获取合并的部分,而不是在本地进行合并。这是为了加快非常长的合并速度。
可能的 value
- 任何正整数。
默认值:3600
prefer_fetch_merged_part_size_threshold
如果部分大小的总和超过此阈值,并且复制日志条目创建后的经过时间大于 prefer_fetch_merged_part_time_threshold
,则优先从副本中获取合并的部分,而不是在本地进行合并。这是为了加快非常长的合并速度。
可能的 value
- 任何正整数。
默认值:10,737,418,240
execute_merges_on_single_replica_time_threshold
当此设置的值大于零时,只有一个副本会立即启动合并,而其他副本最多等待此时间段以下载结果,而不是在本地进行合并。如果选定的副本在此时间段内没有完成合并,则会回退到标准行为。
可能的 value
- 任何正整数。
默认值:0(秒)
remote_fs_execute_merges_on_single_replica_time_threshold
当此设置的值大于零时,如果合并部分在共享存储上,并且 allow_remote_fs_zero_copy_replication
已启用,则只有一个副本会立即启动合并。
ClickHouse 22.8 及更高版本默认情况下禁用零拷贝复制。此功能不建议在生产环境中使用。
可能的 value
- 任何正整数。
默认值:10800
try_fetch_recompressed_part_timeout
开始带有重新压缩的合并之前的超时(以秒为单位)。在此时间段内,ClickHouse 尝试从分配了此带有重新压缩的合并的副本中获取重新压缩的部分。
重新压缩在大多数情况下工作缓慢,因此我们不会在达到此超时之前开始带有重新压缩的合并,并尝试从分配了此带有重新压缩的合并的副本中获取重新压缩的部分。
可能的 value
- 任何正整数。
默认值:7200
always_fetch_merged_part
如果为真,此副本永远不会合并部分,并且始终从其他副本下载合并的部分。
可能的 value
- true,false
默认值:false
max_suspicious_broken_parts
最大损坏部分数,如果更多 - 拒绝自动删除。
可能的 value
- 任何正整数。
默认值:100
max_suspicious_broken_parts_bytes
所有损坏部分的最大大小,如果更多 - 拒绝自动删除。
可能的 value
- 任何正整数。
默认值:1,073,741,824
max_files_to_modify_in_alter_columns
如果要修改(删除,添加)的文件数量大于此设置,则不要应用 ALTER。
可能的 value
- 任何正整数。
默认值:75
max_files_to_remove_in_alter_columns
如果要删除的文件数量大于此设置,则不要应用 ALTER。
可能的 value
- 任何正整数。
默认值:50
replicated_max_ratio_of_wrong_parts
如果错误部件与总部件数的比率小于此值 - 允许启动。
可能的 value
- 浮点数,0.0 - 1.0
默认值:0.5
replicated_max_parallel_fetches_for_host
限制从端点(实际上是池大小)并行获取。
可能的 value
- 任何正整数。
默认值:15
replicated_fetches_http_connection_timeout
用于部件获取请求的 HTTP 连接超时时间。如果未显式设置,则从默认配置文件 http_connection_timeout
继承。
可能的 value
- 任何正整数。
默认值:如果未显式设置,则从默认配置文件 http_connection_timeout
继承。
replicated_can_become_leader
如果为真,此节点上的复制表副本将尝试获取领导权。
可能的 value
- true,false
默认值:true
zookeeper_session_expiration_check_period
ZooKeeper 会话过期检查周期,以秒为单位。
可能的 value
- 任何正整数。
默认值:60
detach_old_local_parts_when_cloning_replica
修复丢失的副本时,不要删除旧的本地部件。
可能的 value
- true,false
默认值:true
replicated_fetches_http_connection_timeout
用于部件获取请求的 HTTP 连接超时时间(以秒为单位)。如果未显式设置,则从默认配置文件 http_connection_timeout 继承。
可能的 value
- 任何正整数。
- 0 - 使用
http_connection_timeout
的值。
默认值:0。
replicated_fetches_http_send_timeout
用于部件获取请求的 HTTP 发送超时时间(以秒为单位)。如果未显式设置,则从默认配置文件 http_send_timeout 继承。
可能的 value
- 任何正整数。
- 0 - 使用
http_send_timeout
的值。
默认值:0。
replicated_fetches_http_receive_timeout
用于获取部件请求的 HTTP 接收超时时间(以秒为单位)。如果未显式设置,则从默认配置文件 http_receive_timeout 继承。
可能的 value
- 任何正整数。
- 0 - 使用
http_receive_timeout
的值。
默认值:0。
max_replicated_fetches_network_bandwidth
限制 复制 获取网络数据交换的最大速度(以字节/秒为单位)。与应用于服务器的 max_replicated_fetches_network_bandwidth_for_server 设置不同,此设置应用于特定表。
您可以同时限制服务器网络和特定表的网络,但为此,表级设置的值应小于服务器级设置的值。否则,服务器将只考虑 max_replicated_fetches_network_bandwidth_for_server
设置。
此设置并非完全准确地遵循。
可能的 value
- 正整数。
- 0 — 无限制。
默认值:0
。
用法
可用于在将数据复制到添加或替换新节点时限制速度。
max_replicated_sends_network_bandwidth
限制 复制 发送网络数据交换的最大速度(以字节/秒为单位)。与应用于服务器的 max_replicated_sends_network_bandwidth_for_server 设置不同,此设置应用于特定表。
您可以同时限制服务器网络和特定表的网络,但为此,表级设置的值应小于服务器级设置的值。否则,服务器将只考虑 max_replicated_sends_network_bandwidth_for_server
设置。
此设置并非完全准确地遵循。
可能的 value
- 正整数。
- 0 — 无限制。
默认值:0
。
用法
可用于在将数据复制到添加或替换新节点时限制速度。
old_parts_lifetime
存储非活动部件的时间(以秒为单位),以防服务器突然重启时数据丢失。
可能的 value
- 任何正整数。
默认值:480。
将多个部件合并到一个新部件后,ClickHouse 将将原始部件标记为非活动状态,并仅在 old_parts_lifetime
秒后删除它们。如果当前查询未使用非活动部件(即,部件的 refcount
为 1),则会删除它们。
fsync
不会为新部件调用,因此在一段时间内,新部件只存在于服务器的 RAM(操作系统缓存)中。如果服务器突然重启,新部件可能会丢失或损坏。为了保护数据,非活动部件不会立即删除。
在启动期间,ClickHouse 检查部件的完整性。如果合并的部件已损坏,ClickHouse 会将非活动部件返回到活动列表,并稍后重新合并它们。然后,损坏的部件被重命名(添加 broken_
前缀)并移动到 detached
文件夹。如果合并的部件未损坏,则原始的非活动部件将被重命名(添加 ignored_
前缀)并移动到 detached
文件夹。
默认的 dirty_expire_centisecs
值(一个 Linux 内核设置)为 30 秒(写入数据仅存储在 RAM 中的最长时间),但在磁盘系统负载过重的情况下,数据可能在更晚的时间写入。实验表明,old_parts_lifetime
的值为 480 秒,在此期间,新部件保证被写入磁盘。
max_bytes_to_merge_at_max_space_in_pool
如果资源足够,则要合并到一个部件中的最大总部件大小(以字节为单位)。max_bytes_to_merge_at_max_space_in_pool
-- 大致对应于自动后台合并创建的最大可能部件大小。
可能的 value
- 任何正整数。
默认值:161061273600(150 GB)。
合并调度程序定期分析分区中的部件大小和数量,如果池中存在足够的空闲资源,则会启动后台合并。合并将持续进行,直到源部件的总大小大于 max_bytes_to_merge_at_max_space_in_pool
为止。
由 OPTIMIZE FINAL 启动的合并忽略 max_bytes_to_merge_at_max_space_in_pool
,并且仅考虑可用资源(空闲磁盘空间)进行合并,直到分区中只剩下一个部件。
max_bytes_to_merge_at_min_space_in_pool
在后台池中可用资源最少的情况下,要合并到一个部件中的最大总部件大小(以字节为单位)。
可能的 value
- 任何正整数。
默认值:1048576(1 MB)
max_bytes_to_merge_at_min_space_in_pool
定义了即使没有足够的磁盘空间(在池中)也能合并的最大总部件大小。这是为了减少小型部件的数量,并降低出现 Too many parts
错误的可能性。合并通过将合并部件的总大小加倍来预订磁盘空间。因此,如果空闲磁盘空间很少,可能会出现这样的情况:存在空闲空间,但此空间已被正在进行的大型合并预订,因此其他合并无法启动,并且每次插入时小型部件的数量都会增加。
merge_max_block_size
从合并部件读取到内存的行数。
可能的 value
- 任何正整数。
默认值:8192
合并从部件中以 merge_max_block_size
行的块为单位读取行,然后合并并将结果写入一个新部件。读取的块被放置在 RAM 中,因此 merge_max_block_size
会影响合并所需的 RAM 大小。因此,对于行非常宽的表,合并可能会消耗大量 RAM(如果平均行大小为 100kb,那么合并 10 个部件时,(100kb * 10 * 8192) = ~ 8GB 的 RAM)。通过减少 merge_max_block_size
,您可以减少合并所需的 RAM 量,但会减慢合并速度。
number_of_free_entries_in_pool_to_lower_max_size_of_merge
当池(或复制队列)中的空闲条目数少于指定的值时,开始降低要处理的合并最大大小(或要放入队列中的最大大小)。这是为了允许小型合并处理 - 而不是用长时间运行的合并填充池。
可能的 value
- 任何正整数。
默认值:8
number_of_free_entries_in_pool_to_execute_mutation
当池中的空闲条目数少于指定的值时,不要执行部件变异。这是为了保留空闲线程用于常规合并,并避免出现 “Too many parts”。
可能的 value
- 任何正整数。
默认值:20
用法
number_of_free_entries_in_pool_to_execute_mutation
设置的值应小于 background_pool_size * background_merges_mutations_concurrency_ratio 的值。否则,ClickHouse 会抛出异常。
max_part_loading_threads
ClickHouse 启动时读取部件的最大线程数。
可能的 value
- 任何正整数。
默认值:auto(CPU 内核数量)。
在启动期间,ClickHouse 会读取所有表的全部部件(读取包含部件元数据的文件),以在内存中构建所有部件的列表。在一些具有大量部件的系统中,此过程可能需要很长时间,并且可以通过增加 max_part_loading_threads
来缩短此时间(如果此过程不是 CPU 和磁盘 I/O 限制)。
max_partitions_to_read
限制在一个查询中可以访问的分区最大数量。
在创建表时指定的设置值可以通过查询级设置覆盖。
可能的 value
- 任何正整数。
默认值:-1(无限制)。
您也可以在查询/会话/配置文件级别指定查询复杂度设置 max_partitions_to_read。
min_age_to_force_merge_seconds
如果范围内每个部件的年龄都超过 min_age_to_force_merge_seconds
的值,则合并部件。
可能的 value
- 正整数。
默认值:0 — 禁用。
min_age_to_force_merge_on_partition_only
min_age_to_force_merge_seconds
是否应该仅应用于整个分区,而不是子集。
可能的 value
- true,false
默认值:false
number_of_free_entries_in_pool_to_execute_optimize_entire_partition
当池中可用条目数量少于指定数量时,不要在后台执行优化整个分区操作(此任务是在设置 min_age_to_force_merge_seconds
并启用 min_age_to_force_merge_on_partition_only
时生成的)。这样做是为了将空闲线程留给常规合并,并避免“太多分区”。
可能的 value
- 正整数。
默认值:25
number_of_free_entries_in_pool_to_execute_optimize_entire_partition
设置的值应该小于 background_pool_size * background_merges_mutations_concurrency_ratio 的值。否则,ClickHouse 会抛出异常。
allow_floating_point_partition_key
启用该设置允许使用浮点数作为分区键。
可能的 value
- 0 — 不允许使用浮点数作为分区键。
- 1 — 允许使用浮点数作为分区键。
默认值:0
。
check_sample_column_is_correct
在创建表时启用该设置,可以检查用于抽样或抽样表达式的列的数据类型是否正确。数据类型必须是无符号 整数类型 中的一种:UInt8
、UInt16
、UInt32
、UInt64
。
可能的 value
- true — 启用检查。
- false — 在创建表时禁用检查。
默认值:true
。
默认情况下,ClickHouse 服务器会在创建表时检查用于抽样或抽样表达式的列的数据类型。如果你已经创建了具有不正确抽样表达式的表,并且不希望服务器在启动时抛出异常,请将 check_sample_column_is_correct
设置为 false
。
min_bytes_to_rebalance_partition_over_jbod
设置启用平衡时的最小字节数,以便将新的较大的分区分布在卷磁盘 JBOD 上。
可能的 value
- 正整数。
- 0 — 禁用平衡。
默认值:0
。
用法
min_bytes_to_rebalance_partition_over_jbod
设置的值不应小于 max_bytes_to_merge_at_max_space_in_pool / 1024 的值。否则,ClickHouse 会抛出异常。
detach_not_byte_identical_parts
启用或禁用在副本上合并或变异后分离数据分区,如果它与其他副本上的数据分区在字节上不完全相同。如果禁用,则数据分区将被删除。如果你想稍后分析这些分区,请激活此设置。
该设置适用于启用了 数据复制 的 MergeTree
表。
可能的 value
- 0 — 分区被删除。
- 1 — 分区被分离。
默认值:0
。
merge_tree_clear_old_temporary_directories_interval_seconds
设置 ClickHouse 执行清理旧临时目录的时间间隔(以秒为单位)。
可能的 value
- 任何正整数。
默认值:60
秒。
merge_tree_clear_old_parts_interval_seconds
设置 ClickHouse 执行清理旧分区、WAL 和变异的时间间隔(以秒为单位)。
可能的 value
- 任何正整数。
默认值:1
秒。
max_concurrent_queries
与 MergeTree 表相关的并发执行查询的最大数量。查询仍然会受到其他 max_concurrent_queries
设置的限制。
可能的 value
- 正整数。
- 0 — 无限制。
默认值:0
(无限制)。
示例
<max_concurrent_queries>50</max_concurrent_queries>
min_marks_to_honor_max_concurrent_queries
查询读取的标记数的最小值,用于应用 max_concurrent_queries 设置。请注意,查询仍然会受到其他 max_concurrent_queries
设置的限制。
可能的 value
- 正整数。
- 0 — 禁用(
max_concurrent_queries
限制不应用于任何查询)。
默认值:0
(限制从不应用)。
示例
<min_marks_to_honor_max_concurrent_queries>10</min_marks_to_honor_max_concurrent_queries>
ratio_of_defaults_for_sparse_serialization
列中默认值的数量与所有值的数量的最小比率。设置此值会导致列使用稀疏序列化存储。
如果列是稀疏的(主要包含零),ClickHouse 可以以稀疏格式对其进行编码并自动优化计算 - 数据在查询期间不需要完全解压缩。要启用此稀疏序列化,请将 ratio_of_defaults_for_sparse_serialization
设置定义为小于 1.0。如果该值大于或等于 1.0,则列将始终使用正常的完整序列化写入。
可能的 value
- 在 0 到 1 之间的浮点数,用于启用稀疏序列化
- 1.0(或更大),如果你不想使用稀疏序列化
默认值:0.9375
示例
请注意,以下表中的 s
列在 95% 的行中为空字符串。在 my_regular_table
中,我们没有使用稀疏序列化,而在 my_sparse_table
中,我们将 ratio_of_defaults_for_sparse_serialization
设置为 0.95
CREATE TABLE my_regular_table
(
`id` UInt64,
`s` String
)
ENGINE = MergeTree
ORDER BY id;
INSERT INTO my_regular_table
SELECT
number AS id,
number % 20 = 0 ? toString(number): '' AS s
FROM
numbers(10000000);
CREATE TABLE my_sparse_table
(
`id` UInt64,
`s` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS ratio_of_defaults_for_sparse_serialization = 0.95;
INSERT INTO my_sparse_table
SELECT
number,
number % 20 = 0 ? toString(number): ''
FROM
numbers(10000000);
请注意,my_sparse_table
中的 s
列在磁盘上占用的存储空间更少
SELECT table, name, data_compressed_bytes, data_uncompressed_bytes FROM system.columns
WHERE table LIKE 'my_%_table';
┌─table────────────┬─name─┬─data_compressed_bytes─┬─data_uncompressed_bytes─┐
│ my_regular_table │ id │ 37790741 │ 75488328 │
│ my_regular_table │ s │ 2451377 │ 12683106 │
│ my_sparse_table │ id │ 37790741 │ 75488328 │
│ my_sparse_table │ s │ 2283454 │ 9855751 │
└──────────────────┴──────┴───────────────────────┴─────────────────────────┘
你可以通过查看 system.parts_columns
表的 serialization_kind
列来验证列是否使用稀疏编码
SELECT column, serialization_kind FROM system.parts_columns
WHERE table LIKE 'my_sparse_table';
你可以看到 s
的哪些部分使用稀疏序列化存储
┌─column─┬─serialization_kind─┐
│ id │ Default │
│ s │ Default │
│ id │ Default │
│ s │ Default │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
│ id │ Default │
│ s │ Sparse │
└────────┴────────────────────┘
replace_long_file_name_to_hash
如果列的名称太长(超过 max_file_name_length
字节),则将其替换为 SipHash128。默认值:false
。
max_file_name_length
保持文件名称不变(不进行哈希)的最大长度。仅在启用 replace_long_file_name_to_hash
设置时生效。此设置的值不包括文件扩展名的长度。因此,建议在最大文件名长度(通常为 255 字节)以下设置它,并留出一些间隙,以避免出现文件系统错误。默认值:127。
allow_experimental_block_number_column
在合并时持久化虚拟列 _block_number
。
默认值:false。
exclude_deleted_rows_for_part_size_in_merge
如果启用,将在选择要合并的分区时使用数据分区的估计实际大小(即,不包括通过 DELETE FROM
删除的那些行)。请注意,这种行为仅在对在启用此设置后执行的 DELETE FROM
影响的数据分区触发。
可能的 value
- true,false
默认值:false
另请参阅
load_existing_rows_count_for_old_parts
如果与 exclude_deleted_rows_for_part_size_in_merge 同时启用,则在表启动时将计算现有数据分区的已删除行计数。请注意,这可能会减慢表启动加载速度。
可能的 value
- true,false
默认值:false
另请参阅
use_compact_variant_discriminators_serialization
为 Variant 数据类型中鉴别符的二进制序列化启用紧凑模式。这种模式允许在分区中使用明显更少的内存来存储鉴别符,当大多数情况下只有一个变体或有很多 NULL 值时。
默认值:true
merge_workload
用于调节资源如何被利用和在合并和其他工作负载之间共享。指定的值用作此表的后台合并的 workload
设置值。如果未指定(空字符串),则使用服务器设置 merge_workload
。
默认值:空字符串
另请参阅
mutation_workload
用于调节资源如何被利用和在变异和其他工作负载之间共享。指定的值用作此表的后台变异的 workload
设置值。如果未指定(空字符串),则使用服务器设置 mutation_workload
。
默认值:空字符串
另请参阅
optimize_row_order
控制在插入时是否应该优化行顺序,以提高新插入的表分区的可压缩性。
仅对普通 MergeTree 引擎表有效。对专门的 MergeTree 引擎表(例如 CollapsingMergeTree)没有影响。
MergeTree 表(可选)使用 压缩编解码器 进行压缩。如果数据暴露模式,则 LZ4 和 ZSTD 等通用压缩编解码器可以实现最大压缩率。相同值的长时间运行通常可以很好地压缩。
如果启用此设置,ClickHouse 会尝试以一种行顺序存储新插入的分区中的数据,这种顺序可以最大程度地减少新表分区各列之间的等值运行次数。换句话说,等值运行次数少意味着单个运行次数多且压缩效果好。
找到最佳行顺序在计算上不可行(NP 难题)。因此,ClickHouse 使用启发式方法来快速找到一个行顺序,该顺序仍然比原始行顺序提高压缩率。
查找行顺序的启发式方法
通常可以自由地对表的行(或表分区)进行重新排序,因为 SQL 将不同行顺序的相同表(表分区)视为等效。
当为表定义了主键时,这种行重新排序的自由度会受到限制。在 ClickHouse 中,主键 C1, C2, ..., CN
强制要求表的行按列 C1
、C2
、... Cn
排序 (聚集索引)。因此,行只能在行“等效类”内重新排序,即在主键列中具有相同值的那些行。直观地说,高基数主键(例如,涉及 DateTime64
时间戳列的主键)会导致许多小的等效类。同样,具有低基数主键的表会创建很少的大等效类。没有主键的表表示单个等效类的极端情况,该等效类跨越所有行。
等效类越少越大,重新排序行时的自由度就越高。
D. Lemire 和 O. Kaser 在 Reordering columns for smaller indexes 中建议的对每个等效类内部查找最佳行顺序的启发式方法,该方法基于按非主键列的基数升序对每个等效类内的行进行排序。它执行三个步骤
- 根据主键列中的行值查找所有等价类。
- 对于每个等价类,计算(通常是估计)非主键列的基数。
- 对于每个等价类,按非主键列基数升序对行排序。
如果启用,插入操作会产生额外的 CPU 成本,用于分析和优化新数据的行顺序。 INSERT 预计会花费 30-50% 更长的时间,具体取决于数据特征。 LZ4 或 ZSTD 的压缩率平均提高 20-40%。
此设置最适合没有主键或主键基数低的表,即只有少数不同主键值的表。高基数主键(例如,包含 DateTime64
类型的 timestamp 列)预计不会从此设置中受益。
lightweight_mutation_projection_mode
默认情况下,轻量级删除 DELETE
不适用于具有投影的表。 这是因为投影中的行可能会受到 DELETE
操作的影响。 所以默认值是 throw
。 但是,此选项可以更改行为。 使用 drop
或 rebuild
值,删除将与投影一起使用。 drop
将删除投影,因此它可能在当前查询中很快,因为投影被删除了,但在将来的查询中会很慢,因为没有附加投影。 rebuild
将重建投影,这可能会影响当前查询的性能,但可能会加快将来的查询。 一个好处是,这些选项只会在部分级别起作用,这意味着没有被触及的部分中的投影将保持完整,而不是触发任何操作,例如删除或重建。
可能的 value
- throw, drop, rebuild
默认值:throw
deduplicate_merge_projection_mode
是否允许为非经典 MergeTree 表创建投影,该表不是 (Replicated, Shared) MergeTree。 忽略选项纯粹是为了兼容性,这可能会导致不正确的结果。 否则,如果允许,合并投影时的操作是什么,是删除还是重建。 所以经典 MergeTree 会忽略此设置。 它也控制 OPTIMIZE DEDUPLICATE
,但对所有 MergeTree 家族成员都有效。 与 lightweight_mutation_projection_mode
选项类似,它也是部分级别的。
可能的 value
- ignore, throw, drop, rebuild
默认值:throw
min_free_disk_bytes_to_perform_insert
为了插入数据,磁盘空间中应该至少空闲的字节数。 如果可用空闲字节数少于 min_free_disk_bytes_to_throw_insert
,则会抛出异常,并且不会执行插入操作。 请注意,此设置
- 会考虑
keep_free_space_bytes
设置。 - 不会考虑
INSERT
操作将写入的数据量。 - 只有在指定了正(非零)字节数时才会检查。
可能的 value
- 任何正整数。
默认值:0 字节。
min_free_disk_ratio_to_perform_insert
执行 INSERT
操作所需的最小空闲磁盘空间与总磁盘空间的比率。 必须是 0 到 1 之间的浮点数。 请注意,此设置
- 会考虑
keep_free_space_bytes
设置。 - 不会考虑
INSERT
操作将写入的数据量。 - 只有在指定了正(非零)比率时才会检查。
可能的 value
- 浮点数,0.0 - 1.0
默认值:0.0
请注意,如果同时指定了 min_free_disk_ratio_to_perform_insert
和 min_free_disk_bytes_to_perform_insert
,ClickHouse 将计算允许在更大数量的空闲内存上执行插入操作的值。