From ab42638f23cb2122996d33dba497b3946121919f Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Mon, 16 Jan 2023 20:13:16 +0800 Subject: [PATCH 01/11] commit --- sql-prepared-plan-cache.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index 9c471fad119d..d104fdd66153 100644 --- a/sql-prepared-plan-cache.md +++ b/sql-prepared-plan-cache.md @@ -18,11 +18,9 @@ TiDB 优化器对这两类查询的处理是一样的:`Prepare` 时将参数 - `SELECT`、`UPDATE`、`INSERT`、`DELETE`、`Union`、`Intersect`、`Except` 以外的 SQL 语句; - 访问分区表、临时表或访问表中包含生成列的查询; -- 包含子查询的查询,如 `select * from t where a > (select ...)`; - 包含 `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, ?`,此时 `?` 的具体值对查询性能影响较大,故不缓存; - `?` 直接在 `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)`;如果 `?` 出现在窗口函数的其他位置,则会缓存; From 0c93bd6ee8eae53a1eda17bfdf6a823ca7511c3a Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Sun, 29 Jan 2023 14:28:21 +0800 Subject: [PATCH 02/11] Update sql-prepared-plan-cache.md --- sql-prepared-plan-cache.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index d104fdd66153..354a11643b88 100644 --- a/sql-prepared-plan-cache.md +++ b/sql-prepared-plan-cache.md @@ -18,6 +18,7 @@ TiDB 优化器对这两类查询的处理是一样的:`Prepare` 时将参数 - `SELECT`、`UPDATE`、`INSERT`、`DELETE`、`Union`、`Intersect`、`Except` 以外的 SQL 语句; - 访问分区表、临时表或访问表中包含生成列的查询; +- 包含子查询的查询,如 `select * from t where a > (select ...)`; - 包含 `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`; From 5b47bd5a85acb062dc19e53fa753cb83e2afb21d Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Mon, 30 Jan 2023 20:44:11 +0800 Subject: [PATCH 03/11] Update sql-prepared-plan-cache.md --- sql-prepared-plan-cache.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index 354a11643b88..71d37563a12d 100644 --- a/sql-prepared-plan-cache.md +++ b/sql-prepared-plan-cache.md @@ -22,6 +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` 后面的 `Count` 为 `?` 且具体参数值大于 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)`;如果 `?` 出现在窗口函数的其他位置,则会缓存; From 291a25413fd5e3de01361e1e757184e8e1a23e42 Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:38:21 +0800 Subject: [PATCH 04/11] commit --- system-variables.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system-variables.md b/system-variables.md index 09d08a0ab9c3..0a305e698b7b 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1503,6 +1503,12 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 默认值:`ON` - 该变量指定是否对窗口函数采用流水线的执行算法。 +### `tidb_enable_plan_cache_for_param_limit` +- 作用域:SESSION | GLOBAL +- 是否持久化到集群:是 +- 默认值:`ON` +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `limit` 后带有参数的执行计划。 + ### `tidb_enable_plan_replayer_capture` > 警告: From 4101decfcd044c394e4ec3d53d86c44ce268225d Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:41:31 +0800 Subject: [PATCH 05/11] Update system-variables.md Co-authored-by: Aolin --- system-variables.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system-variables.md b/system-variables.md index 0a305e698b7b..52f92e9831bc 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1503,7 +1503,8 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 默认值:`ON` - 该变量指定是否对窗口函数采用流水线的执行算法。 -### `tidb_enable_plan_cache_for_param_limit` +### `tidb_enable_plan_cache_for_param_limit` 从 v6.6.0 版本开始引入 + - 作用域:SESSION | GLOBAL - 是否持久化到集群:是 - 默认值:`ON` From 3a3e4420b8e3bea72b7bf448a0dae17d1607df6d Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Wed, 1 Feb 2023 14:41:42 +0800 Subject: [PATCH 06/11] Update system-variables.md Co-authored-by: Aolin --- system-variables.md | 1 + 1 file changed, 1 insertion(+) diff --git a/system-variables.md b/system-variables.md index 52f92e9831bc..7822467d5b0e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1507,6 +1507,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 作用域:SESSION | GLOBAL - 是否持久化到集群:是 +- 类型:布尔型 - 默认值:`ON` - 这个变量用来控制 Prepared Plan Cache 是否缓存 `limit` 后带有参数的执行计划。 From ff615b60a7d041a8bd1356db027ac70533e4ba56 Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Fri, 3 Feb 2023 14:30:09 +0800 Subject: [PATCH 07/11] Update system-variables.md --- system-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-variables.md b/system-variables.md index 7822467d5b0e..8b1d572fa999 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1509,7 +1509,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 是否持久化到集群:是 - 类型:布尔型 - 默认值:`ON` -- 这个变量用来控制 Prepared Plan Cache 是否缓存 `limit` 后带有参数的执行计划。 +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `limit` 后带有参数的执行计划, `Limit` 后面的 `Count` 具体参数值大于 10000 的执行计划目前不支持缓存。 ### `tidb_enable_plan_replayer_capture` From 1ca3a865734d575e274319f925b3c107a25285fd Mon Sep 17 00:00:00 2001 From: fzzf678 <108643977+fzzf678@users.noreply.github.com> Date: Mon, 6 Feb 2023 09:16:08 +0800 Subject: [PATCH 08/11] Update system-variables.md Co-authored-by: Aolin --- system-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-variables.md b/system-variables.md index 8b1d572fa999..b6eb5722979e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1509,7 +1509,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 是否持久化到集群:是 - 类型:布尔型 - 默认值:`ON` -- 这个变量用来控制 Prepared Plan Cache 是否缓存 `limit` 后带有参数的执行计划, `Limit` 后面的 `Count` 具体参数值大于 10000 的执行计划目前不支持缓存。 +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `Limit` 后带有参数的执行计划。目前不支持缓存 `Limit` 后面的 `Count` 具体参数值大于 10000 的执行计划。 ### `tidb_enable_plan_replayer_capture` From 4f8a52e0ae8d2f757f26a00535cdbee4c4104721 Mon Sep 17 00:00:00 2001 From: Yuanjia Zhang Date: Thu, 16 Feb 2023 18:56:06 +0800 Subject: [PATCH 09/11] Update system-variables.md Co-authored-by: shichun-0415 <89768198+shichun-0415@users.noreply.github.com> --- system-variables.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system-variables.md b/system-variables.md index b6eb5722979e..6a1bf56131b1 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1509,7 +1509,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 是否持久化到集群:是 - 类型:布尔型 - 默认值:`ON` -- 这个变量用来控制 Prepared Plan Cache 是否缓存 `Limit` 后带有参数的执行计划。目前不支持缓存 `Limit` 后面的 `Count` 具体参数值大于 10000 的执行计划。 +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `Limit` 后面带变量 (`LIMIT ?`) 的执行计划。目前不支持缓存 `Limit` 后面带变量且变量值大于 10000 的执行计划。 ### `tidb_enable_plan_replayer_capture` From 43cca36121e0b7fc6e190a4eb03d921d44d7d94a Mon Sep 17 00:00:00 2001 From: Yuanjia Zhang Date: Thu, 16 Feb 2023 18:56:11 +0800 Subject: [PATCH 10/11] Update sql-prepared-plan-cache.md Co-authored-by: shichun-0415 <89768198+shichun-0415@users.noreply.github.com> --- sql-prepared-plan-cache.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index 71d37563a12d..959ed8d4a78e 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` 后面的 `Count` 为 `?` 且具体参数值大于 10000 的执行计划不缓存; +- `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)`;如果 `?` 出现在窗口函数的其他位置,则会缓存; From bbf87bf3f0e8d17a8431569b1fc1055ae361270c Mon Sep 17 00:00:00 2001 From: shichun-0415 <89768198+shichun-0415@users.noreply.github.com> Date: Thu, 16 Feb 2023 18:57:37 +0800 Subject: [PATCH 11/11] Apply suggestions from code review Co-authored-by: Aolin --- sql-prepared-plan-cache.md | 2 +- system-variables.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sql-prepared-plan-cache.md b/sql-prepared-plan-cache.md index 959ed8d4a78e..a297ace83b2a 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 ?`) 且变量值大于 10000 的执行计划不缓存; +- `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 6a1bf56131b1..e92a0a73927e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1509,7 +1509,7 @@ MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数 - 是否持久化到集群:是 - 类型:布尔型 - 默认值:`ON` -- 这个变量用来控制 Prepared Plan Cache 是否缓存 `Limit` 后面带变量 (`LIMIT ?`) 的执行计划。目前不支持缓存 `Limit` 后面带变量且变量值大于 10000 的执行计划。 +- 这个变量用来控制 Prepared Plan Cache 是否缓存 `LIMIT` 后面带变量 (`LIMIT ?`) 的执行计划。目前不支持缓存 `LIMIT` 后面带变量且变量值大于 10000 的执行计划。 ### `tidb_enable_plan_replayer_capture`