设置与查询级 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_algorithm | join 实现选择 | 不同算法内存与速度差异明显 |
用户 profile 里可以限定单查询内存与并发,这是防止一条大查询拖垮整机的关键;查询级设置改不动 profile 的硬限制,分层设计的用意就在于此。
max_memory_usage 设为 0 表示不限制,生产环境要按机器内存设置合理上限,否则一条失控查询就能把节点拖到不可用。
system.settings 里的 value 是服务端当前值,与客户端会话中的值可能不同,排查「设置没生效」这类问题时应以它为准。