diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index 5ed273ad8f18..6941190f9b29 100644 --- a/sql-prepared-plan-cache.md +++ b/sql-prepared-plan-cache.md @@ -22,7 +22,7 @@ TiDB 优化器对这两类查询的处理是一样的:`Prepare` 时将参数 - 包含 `ignore_plan_cache` 这一 Hint 的查询,例如 `select /*+ ignore_plan_cache() */ * from t`; - 包含除 `?` 外其他变量(即系统变量或用户自定义变量)的查询,例如 `select * from t where a>? and b>@x`; - 查询包含无法被缓存函数。目前不能被缓存的函数有:`database()`、`current_user`、`current_role`、`user`、`connection_id`、`last_insert_id`、`row_count`、`version`、`like`; -- `?` 在 `Limit` 后的查询,如 `Limit ?` 或者 `Limit 10, ?`,此时 `?` 的具体值对查询性能影响较大,故不缓存; +- `LIMIT` 后面带一个变量 (`LIMIT ?`) 且变量值大于 10000 的执行计划不缓存; - `?` 直接在 `Order By` 后的查询,如 `Order By ?`,此时 `?` 表示根据 `Order By` 后第几列排序,排序列不同的查询使用同一个计划可能导致错误结果,故不缓存;如果是普通表达式,如 `Order By a+?` 则会缓存; - `?` 紧跟在 `Group by` 后的查询,如 `Group By ?`,此时 `?` 表示根据 `Group By` 后第几列聚合,聚合列不同的查询使用同一个计划可能导致错误结果,故不缓存;如果是普通表达式,如 `Group By a+?` 则会缓存; - `?` 出现在窗口函数 `Window Frame` 定义中的查询,如 `(partition by year order by sale rows ? preceding)`;如果 `?` 出现在窗口函数的其他位置,则会缓存; diff --git a/system-variables.md b/system-variables.md index 86e11b8e3657..332ad60418ca 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1513,6 +1513,14 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 默认值:`ON` - 该变量指定是否对窗口函数采用流水线的执行算法。 +### `tidb_enable_plan_cache_for_param_limit` 从 v6.6.0 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 是否持久化到集群:是 +- 类型:布尔型 +- 默认值:`ON` +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `LIMIT` 后面带变量 (`LIMIT ?`) 的执行计划。目前不支持缓存 `LIMIT` 后面带变量且变量值大于 10000 的执行计划。 + ### `tidb_enable_plan_replayer_capture` - 作用域:SESSION | GLOBAL