首页/数据/NoSQL 速查/设置与查询级 SETTINGS
ClickHouse56 条

设置与查询级 SETTINGS

ClickHouse 设置分用户配置(users.xml/profile)与查询级 SETTINGS:后者只影响当前语句,适合临时控制线程数、内存上限与超时,排障与压测时常用。

NoSQL 速查数据更新于 2026-10-13

设置与查询级 SETTINGS 是什么

ClickHouse 的设置有分层:用户配置(users.xml 里的 profile,管配额与硬限制)与查询级 SETTINGS(只影响当前语句)。查询级设置适合临时控制线程数、内存上限与超时,压测与排障时最常用。查看设置可以用 system.settings 表,它给出名称、当前值与说明。查询级设置无法突破用户 profile 定义的硬限制,这个分层也是生产环境防止单条大查询拖垮整机的主要手段。

基本信息

查询级写法SELECT ... SETTINGS max_threads = 4, max_memory_usage = 10000000000
会话级写法SET max_threads = 8;(当前会话生效)
常用设置max_threads、max_memory_usage、max_execution_time、join_algorithm
查看生效值SELECT name, value FROM system.settings
优先级用户 profile 的硬限制高于查询级设置
所属系统ClickHouse

典型使用场景

  • 临时降负载:高峰期给个别大查询限制线程数与内存
  • 排障限时:给排查用的查询加执行超时,避免长时间占用资源
  • 压测对照:用不同线程数跑同一语句,量化并行度带来的收益
  • 控制溢写:调整分组聚合溢出到磁盘的内存阈值
  • 核对生效值:改完配置后用 system.settings 确认实际取值

两种用法

两种用法
SELECT count() FROM events SETTINGS max_threads = 2;   -- 只影响这一条查询

SET max_execution_time = 60;                          -- 会话级,当前连接内生效

SELECT name, value, description                        -- 查看设置当前值与说明
FROM system.settings
WHERE name IN ('max_threads', 'max_memory_usage');

常用设置读法

设置作用注意
max_threads单查询并行度超过 CPU 核数不会更快
max_memory_usage单查询内存上限0 表示不限制,生产必须设值
max_execution_time单查询超时秒数防止查询长时间占用资源
max_bytes_before_external_group_by溢写磁盘的阈值与总内存配额配合设置
join_algorithmjoin 实现选择不同算法内存与速度差异明显
用户 profile 里可以限定单查询内存与并发,这是防止一条大查询拖垮整机的关键;查询级设置改不动 profile 的硬限制,分层设计的用意就在于此。
max_memory_usage 设为 0 表示不限制,生产环境要按机器内存设置合理上限,否则一条失控查询就能把节点拖到不可用。
system.settings 里的 value 是服务端当前值,与客户端会话中的值可能不同,排查「设置没生效」这类问题时应以它为准。

易错点

  • max_memory_usage 设为 0 表示不限制,生产环境要按机器内存设置合理上限
  • 把 max_threads 调大到超过核数不会更快,反而增加调度与内存压力
  • 以为查询级设置能覆盖用户 profile:profile 的限制优先级更高,改不动
  • 会话级 SET 用完忘记恢复,同一连接上后续查询都带着这个设置运行

数据来源与参考

  • ClickHouse Docs: SET statement
  • ClickHouse Docs: Server settings
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌