1. ClickHouse 查詢時,報錯:Memory limit (for query) exceeded: would use 9.38 GiB (attempt to allocate chunk of 135439453 bytes), maximum: 9.31 GiB
1.1 ClickHouse 環境
1.2 報錯原因
默認情況下,ClickHouse會限制group by使用的內存量(它使用 hash table來處理group by)。這很容易解決 - 如果你有空閑的內存,增加這個參數
1.3 解決方法
1. 內存足夠情況下
SET max_memory_usage = 128000000000; #128G
2. 內存不足情況下
GROUP BY中允許將臨時數據轉存到磁盤上,以限制對內存的使用
set max_bytes_before_external_group_by=20000000000; #20G,默認值為0,表示在GROUP BY中啟動將臨時數據轉存到磁盤上的內存閾值。
# 使用max_bytes_before_external_group_by時,建議將max_memory_usage設置為它的兩倍。這是因為一個聚合需要兩個階段來完成:
#(1)讀取數據並形成中間數據
#(2)合並中間數據。臨時數據的轉存只會發生在第一個階段。
# 如果沒有發生臨時文件的轉存,那么階段二將最多消耗與1階段相同的內存大小。
set max_memory_usage=40000000000; #40G