> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> 一种 Experimental 技术，旨在为查询设置更灵活的内存限制。

# 内存 overcommit

内存 overcommit 是一种 Experimental 技术，旨在为查询设置更灵活的内存限制。

这项技术的核心思路是引入一些设置，用于表示查询可保证使用的内存量。
启用内存 overcommit 后，一旦达到内存限制，ClickHouse 会选择 overcommit 程度最高的查询，并尝试通过终止该查询来释放内存。

达到内存限制时，任何查询在尝试分配新内存时都会等待一段时间。
如果在 timeout 到期前释放了内存，查询将继续执行。
否则将抛出异常，并终止该查询。

根据达到的是哪种内存限制，系统会由全局或用户 overcommit 跟踪器来选择要停止或终止的查询。
如果 overcommit 跟踪器无法选择要停止的查询，则会抛出 MEMORY\_LIMIT\_EXCEEDED 异常。

<div id="user-overcommit-tracker">
  ## 用户 overcommit 跟踪器
</div>

用户 overcommit 跟踪器会在该用户的查询列表中找出 overcommit ratio 最大的查询。
查询的 overcommit ratio 计算方式为：已分配的字节数除以设置项 `memory_overcommit_ratio_denominator_for_user` 的值。

如果该查询的 `memory_overcommit_ratio_denominator_for_user` 等于零，overcommit 跟踪器将不会选择该查询。

等待超时时间由设置项 `memory_usage_overcommit_max_wait_microseconds` 指定。

**示例**

```sql theme={null}
SELECT number FROM numbers(1000) GROUP BY number SETTINGS memory_overcommit_ratio_denominator_for_user=4000, memory_usage_overcommit_max_wait_microseconds=500
```

<div id="global-overcommit-tracker">
  ## 全局 overcommit 跟踪器
</div>

全局 overcommit 跟踪器会在所有查询中找出 overcommit ratio 最大的查询。
这里，overcommit ratio 的计算方式为：已分配的字节数除以设置 `memory_overcommit_ratio_denominator` 的值。

如果某个查询的 `memory_overcommit_ratio_denominator` 等于零，overcommit 跟踪器就不会选择该查询。

等待超时时间由配置文件中的 `memory_usage_overcommit_max_wait_microseconds` 参数设置。
