文档

云数据库ClickHouse执行查询任务时提示“Memory limit (for query) exceeded”错误

更新时间:
一键部署

问题描述

阿里云云数据库ClickHouse执行查询任务时,实例内存升高,提示类似以下错误:

  • Memory limit (for query) exceeded
  • Memory limit (for total) exceeded

问题原因

实例内存升高的原因如下:

  • 查询内存占用过多
  • 实例总内存使用超限

解决方案

ClickHouse服务端对所有查询线程都配有memory tracker,同一个查询下的所有线程tracker会汇报给一个memory tracker for query,再上层还是memory tracker for total。您可以根据情况采取如下解决方案:

  • 遇到Memory limit (for query)超限报错说明是查询内存占用过多(实例总内存的70%)导致失败,这种情况下您需要垂直升配提高实例内存规模。如何进行垂直升配,详情请参见社区兼容版变配和扩缩容
  • 遇到Memory limit (for total)超限报错说明是实例总内存使用超限(实例总内存的90%),这种情况下您可以尝试降低查询并发,如果仍然不行则可能是后台异步任务占用了比较大的内存(常常是写入后主键合并任务),您需要垂直升配提高实例内存规模。

更多信息

那些查询操作导致CPU和内存升高,您可以在system.query_log系统表中自助查看CPU、内存高期间的查询日志,里面有每个查询的CPU消耗和内存消耗统计。更多信息请参见system.query_log。将访问日志导出的命令如下:

SELECT * FROM system.query_log INTO OUTFILE access.log

适用于

  • 云数据库ClickHouse
  • 本页导读
文档反馈