# TiDB Server 的缓存

__*TiDB Server 缓存*__
__*tidb-mem-quota-query*__
__*oom-action*__

+ TiDB Server 缓存组成
  + SQL 结果
  + 线程缓存
  + 元数据,统计信息
+ TiDB Server 缓存管理
  + `tidb_mem_quota_query`
  + `oom-action`
-------------------------------------------------------------
TiDB Server 缓存默认是使用服务器的全部内存的,首先我们看下内存都使用在哪些关键环节上:

1. TiDB Server 缓存组成
  1. 复杂的 SQL 查询,例如,执行计划中使用了 hash join、过多的子查询,这些计算无法完全由下推到 TiKV 节点的算子来完成,数据必须在 TIDB Server 的缓存中做整理,才能返回给用户。Update&Delete 涉及数据量过大也会占用大量缓存。
  2. 线程的缓存都是使用 TiDB Server 的缓存的,如果活跃的线程数过多,也会造成缓存的大量使用。
  3. 表的元数据,information schema,用户认证赋权数据和统计信息是需要缓存的。

那么为了更好地管理缓存,有哪些参数呢？

2. TiDB Server 缓存管理
  1. tidb-mem-quota-query 参数可以控制每个 Query 默认的缓存使用量, 另外还有类似的参数,我们可以参考文档:https://docs.pingcap.com/zh/tidb/stable/configure-memory-usage
  2. oom-action 的配置项如果使用的是 "cancel",那么当一条 SQL 的内存使用超过一定阈值后,TiDB 会立即中断这条 SQL 的执行并给客户端返回一个 error,error 信息中会详细写明这条 SQL 执行过程中各个占用内存比较多的物理执行算子的内存使用情况。