clickhouse 参数优化配置

本文介绍了ClickHouse数据库系统的性能优化方法,包括如何通过配置文件调整服务器和用户的内存使用限制,以及如何启用外部排序和聚合等功能来提高查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

clickhouse 参数优化配置

配置文件/etc/clickhouse-server/config.xml

max_server_memory_usage 服务器进程的最大内存使用量,限制服务器的总内存使用

  • 零值或未设置表示默认值。
  • 默认为:memory_amount(内存总量) * max_server_memory_usage_to_ram_ratio(占比分数值)

max_server_memory_usage_to_ram_ratio 用来计算 max_server_memory_usage 的值。

  • 定义 ClickHouse 服务器可用的总物理 RAM 量的比例。如果服务器尝试使用更多内存,则会将内存减少到适当的数量
  • 默认值0,代表 ClickHouse 服务器可以使用所有可用的 RAM
  • 在 RAM 和交换空间较低的主机上,您可能需要设置max_server_memory_usage_to_ram_ratio大于 1。

配置文件/etc/clickhouse-server/users.xml

max_memory_usage_for_user 用于在单个服务器上运行用户查询的最大 RAM 量。

  • 默认0,不限制

max_memory_usage 用于在单个服务器上运行查询的最大 RAM 量。

  • 默认值10G
  • 该设置不考虑可用内存量或机器上的总内存量。该限制适用于单个服务器中的单个查询

max_bytes_before_external_group_by 启用或禁用GROUP BY外部存储器(磁盘)中子句的执行

  • 默认0,GROUP BY在外部存储器中禁用。
  • 单个GROUP BY操作可以使用的最大 RAM 容量(以字节为单位)
  • 建议设置max_memory_usagemax_bytes_before_external_group_by 两倍的内存。这是必要的,因为聚合有两个阶段:读取数据并形成中间数据(1)和合并中间数据(2)。只能在第 1 阶段将数据转储到文件系统。如果未转储临时数据,则第 2 阶段可能需要与第 1 阶段相同的内存量。
  • 通过分布式查询处理,在远程服务器上执行外部聚合。为了让请求者服务器只使用少量 RAM,设置distributed_aggregation_memory_efficient为 1。
  • 合并刷新到磁盘的数据时,以及在distributed_aggregation_memory_efficient启用该设置时合并来自远程服务器的结果时,最多消耗1/256 * the_number_of_threadsRAM 总量。
  • 启用外部聚合时,如果数据少于max_bytes_before_external_group_by(即数据未刷新),则查询运行速度与没有外部聚合时一样快。如果刷新了任何临时数据,则运行时间将延长几倍(大约三倍)。
  • 外部存储器中的 GROUP BY

max_bytes_before_external_sort

  • 默认0, ORDER BY在外部存储器中禁用。
  • 当要排序的数据量达到指定的字节数时,将对收集的数据进行排序并转储到临时文件中。 读取所有数据后,将合并所有已排序的文件并输出结果。 文件被写入到 /var/lib/clickhouse/tmp/ 目录中的配置(默认情况下,但你可以使用 tmp_path 参数来更改此设置)。
  • 外部排序的工作效率远远低于在RAM中进行排序。

distributed_aggregation_memory_efficient 是否启用分布式聚合的内存节省模式。

  • 默认1 ,启用

其他优化参数

insert_deduplicate 数据复制表引擎中 数据块被重复数据删除。对于同一数据块的多次写入(相同大小的数据块包含相同顺序的相同行),该块只被写入一次。这样做的原因是当客户端应用程序不知道数据是否已写入数据库时发生网络故障,因此可以简单地重复 INSERT 查询。将相同数据发送到哪个副本 INSERT 并不重要。INSERT 是幂等的。重复数据删除参数由 merge_tree 服务器设置控制。 insert_deduplicate 对于复制表中的 INSERT 查询,指定应执行插入块的重复数据删除。 默认是启用去重,日志会出现Block with ID xx already exists locally as part xx ; ignoring it

max_insert_threads 执行INSERT SELECT查询的最大线程数。 值为0或1表示INSERT SELECT不是并行运行的。 更高的值将导致更高的内存使用。 只有当SELECT部分是并行运行时,并行INSERT SELECT才有效,请参阅’max_threads’设置。

parallel_distributed_insert_select 在同一个集群中,在每个shard的本地表上处理分布式的INSERT SELECT查询; 如果设置为1 -在每个shard上执行SELECT; 如果设置为2,则在每个shard上执行SELECT和INSERT

insert_distributed_sync 默认情况下,向Distributed表中插入数据时,ClickHouse 服务器以异步方式向集群节点发送数据。当 时insert_distributed_sync=1,数据是同步处理的,只有在所有分片上保存所有数据(如果为真INSERT,每个分片至少有一个副本),操作成功。

async_insert_threads 在后台实际解析和插入数据的最大线程数。0表示禁用异步模式

async_insert 如果为true, INSERT查询中的数据将存储在队列中,然后在后台刷新到表中。只有通过HTTP协议插入才有意义。如果wait_for_async_insert为false,则INSERT查询几乎立即被处理,否则客户端将等待数据刷新到表中

wait_for_async_insert如果为真,则等待异步插入处理

查看参数的默认值和含义

show settings ilike '%distributed_aggregation_memory_efficient%';
select  * from `system`.settings s where name in(
        'max_memory_usage_for_user', 
        'max_memory_usage', 
        'max_bytes_before_external_group_by', 
        'max_bytes_before_external_sort', 
        'max_memory_usage_for_all_queries', 
        'max_concurrent_queries_for_user',
        'max_concurrent_queries_for_all_users',
        'max_concurrent_queries',
        'max_server_memory_usage',
        'max_server_memory_usage_to_ram_ratio',
        'max_thread_pool_size',
        'distributed_aggregation_memory_efficient'
    );
### 关于 ClickHouse 参数优化的方法和建议 #### 修改配置文件以适应业务需求 为了使 ClickHouse 更好地服务于特定的应用场景,在使用前应当调整其配置文件中的某些默认设置,例如数据存储路径、集群信息以及用户权限等。这些更改有助于更精细地管理和控制 ClickHouse 的运行环境,从而提高效率并确保安全性[^1]。 #### 性能调优应用场景 ClickHouse 的性能调优适用于多种具体的数据处理任务: - **实时数据分析**:针对大规模动态更新的数据集提供即时查询响应; - **日志分析**:高效解析各类记录型数据源,如服务器活动跟踪或应用程序事件流; - **时间序列数据分析**:特别适合连续采集的时间戳关联数值集合,像传感器网络监测或是金融市场行情变化监控; 对于上述每种情况而言,合理的参数设定能够显著提升系统的整体表现力[^2]。 #### 使用跳数索引加速查询过程 当 WHERE 子句内含有涉及列的操作函数时,如果此列为已建立好的索引部分,则 ClickHouse 将尽可能利用现有索引来加快检索速度。然而需要注意的是,并不是所有的内置函数都兼容这种机制——只有被官方支持的那一组有限数量的函数才允许如此操作。因此了解哪些类型的表达式可以在不破坏索引效能的前提下应用于过滤条件是非常重要的[^3]。 #### 设定冷备份策略保障数据安全 考虑到一些特殊行业的要求(如金融领域),可能需要长时间保存历史资料而不频繁访问它们。此时可考虑构建专门用于此类目的“冷备”集群来存放这类低活跃度的信息副本。尽管这样做会增加额外的成本开销,但由于采用了高压缩率技术使得实际占用空间大幅减少,同时也能有效降低因意外丢失重要档案所带来的风险[^4]。 ```sql -- 示例 SQL 查询语句展示如何创建带有主键索引表结构 CREATE TABLE example_table ( id UInt64, timestamp DateTime, value Float64, INDEX idx_timestamp (timestamp) TYPE minmax GRANULARITY 1 ) ENGINE = MergeTree() ORDER BY id; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值