From 02ab92097ca8170b7b8376a39c7d6c19a37a96e8 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Mon, 2 Aug 2021 17:26:56 +0800 Subject: [PATCH 01/20] spm: ban baseline evolution feature --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 9759e4673c92..bbbf51c0e5d4 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -231,7 +231,7 @@ set global tidb_evolve_plan_baselines = on; > **注意:** > -> 自动演进绑定功能目前不是 GA (Generally Available) 状态,不推荐在生产环境打开该功能。 +> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From 53e4a2c7359a1ec7e5930e21065c6eb19f2a55ed Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Wed, 4 Aug 2021 11:56:27 +0800 Subject: [PATCH 02/20] Update sql-plan-management.md --- sql-plan-management.md | 46 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index bbbf51c0e5d4..0b217cb615f7 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -173,7 +173,7 @@ explain select * from t1,t2 where t1.id = t2.id; SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; ``` -该语句会输出 GLOBAL 或者 SESSION 作用域内的执行计划绑定,在不指定作用域时默认作用域为 SESSION。目前 `SHOW BINDINGS` 会输出 8 列,具体如下: +该语句会按照绑定更新时间由新到旧的顺序输出 GLOBAL 或者 SESSION 作用域内的执行计划绑定,在不指定作用域时默认作用域为 SESSION。目前 `SHOW BINDINGS` 会输出 8 列,具体如下: | 列名 | 说明 | | -------- | ------------- | @@ -187,6 +187,50 @@ SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; | collation | 排序规则 | | source | 创建方式,包括 manual (由 `create [global] binding` 生成)、capture(由 tidb 自动创建生成)和 evolve (由 tidb 自动演进生成) | +### 绑定的排查 + +{{< copyable "sql" >}} + +```sql +SELECT [SESSION] @@last_plan_from_binding; +``` + +该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 + +{{< copyable "sql" >}} + +```sql +SHOW [SESSION] STATUS LIKE 'last_plan_binding_update_time'; +``` + +该语句使用状态变量 last_plan_binding_update_time 显示当前机器中 Binding 上一次的更新时间。其中 last_plan_binding_update_time 的默认值是 '0000-00-00 00:00:00'。 + +另外,当我们使用 explain 语句查看 SQL 的查询计划时,如果该 SQL 使用了 Binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 Binding。 + +``` +-- 创建一个 global binding +create global binding for + select * from t +using + select * from t; + +-- 查看所有的 Binding +show global bindings; + +-- 查看上一次 Binding 更新的时间,对比上一条语句的查询结果可以发现其展示的值是 Binding 最新更新的时间 +show status like 'last_plan_binding_update_time'; + +-- 执行被绑定的查询 +select * from t; + +-- 通过查看系统变量 last_plan_from_binding 展示上一条查询是否使用了 Binding +select @@last_plan_from_binding; + +-- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding +explain select * from t; +show warnings; +``` + ## 自动捕获绑定 (Baseline Capturing) 通过将 `tidb_capture_plan_baselines` 的值设置为 `on`(其默认值为 `off`)可以打开自动捕获绑定功能。 From ec5e457faa6853b19b8b68688037909f63d05482 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Wed, 4 Aug 2021 18:14:59 +0800 Subject: [PATCH 03/20] Update sql-plan-management.md --- sql-plan-management.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 0b217cb615f7..17e52d1274c6 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -197,14 +197,6 @@ SELECT [SESSION] @@last_plan_from_binding; 该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 -{{< copyable "sql" >}} - -```sql -SHOW [SESSION] STATUS LIKE 'last_plan_binding_update_time'; -``` - -该语句使用状态变量 last_plan_binding_update_time 显示当前机器中 Binding 上一次的更新时间。其中 last_plan_binding_update_time 的默认值是 '0000-00-00 00:00:00'。 - 另外,当我们使用 explain 语句查看 SQL 的查询计划时,如果该 SQL 使用了 Binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 Binding。 ``` @@ -220,12 +212,6 @@ show global bindings; -- 查看上一次 Binding 更新的时间,对比上一条语句的查询结果可以发现其展示的值是 Binding 最新更新的时间 show status like 'last_plan_binding_update_time'; --- 执行被绑定的查询 -select * from t; - --- 通过查看系统变量 last_plan_from_binding 展示上一条查询是否使用了 Binding -select @@last_plan_from_binding; - -- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding explain select * from t; show warnings; @@ -275,7 +261,7 @@ set global tidb_evolve_plan_baselines = on; > **注意:** > -> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请与 PingCAP 的技术支持联系获取相关支持。 +> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它关闭,如发现 Binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From c902f708c9c3836039b6d025f4dd954768b1750a Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Mon, 2 Aug 2021 17:26:56 +0800 Subject: [PATCH 04/20] spm: ban baseline evolution feature --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 9759e4673c92..bbbf51c0e5d4 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -231,7 +231,7 @@ set global tidb_evolve_plan_baselines = on; > **注意:** > -> 自动演进绑定功能目前不是 GA (Generally Available) 状态,不推荐在生产环境打开该功能。 +> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From 8e15c40ecae89a7835d8d2ef3d99e81524f38587 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Wed, 4 Aug 2021 11:56:27 +0800 Subject: [PATCH 05/20] Update sql-plan-management.md --- sql-plan-management.md | 46 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index bbbf51c0e5d4..0b217cb615f7 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -173,7 +173,7 @@ explain select * from t1,t2 where t1.id = t2.id; SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; ``` -该语句会输出 GLOBAL 或者 SESSION 作用域内的执行计划绑定,在不指定作用域时默认作用域为 SESSION。目前 `SHOW BINDINGS` 会输出 8 列,具体如下: +该语句会按照绑定更新时间由新到旧的顺序输出 GLOBAL 或者 SESSION 作用域内的执行计划绑定,在不指定作用域时默认作用域为 SESSION。目前 `SHOW BINDINGS` 会输出 8 列,具体如下: | 列名 | 说明 | | -------- | ------------- | @@ -187,6 +187,50 @@ SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; | collation | 排序规则 | | source | 创建方式,包括 manual (由 `create [global] binding` 生成)、capture(由 tidb 自动创建生成)和 evolve (由 tidb 自动演进生成) | +### 绑定的排查 + +{{< copyable "sql" >}} + +```sql +SELECT [SESSION] @@last_plan_from_binding; +``` + +该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 + +{{< copyable "sql" >}} + +```sql +SHOW [SESSION] STATUS LIKE 'last_plan_binding_update_time'; +``` + +该语句使用状态变量 last_plan_binding_update_time 显示当前机器中 Binding 上一次的更新时间。其中 last_plan_binding_update_time 的默认值是 '0000-00-00 00:00:00'。 + +另外,当我们使用 explain 语句查看 SQL 的查询计划时,如果该 SQL 使用了 Binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 Binding。 + +``` +-- 创建一个 global binding +create global binding for + select * from t +using + select * from t; + +-- 查看所有的 Binding +show global bindings; + +-- 查看上一次 Binding 更新的时间,对比上一条语句的查询结果可以发现其展示的值是 Binding 最新更新的时间 +show status like 'last_plan_binding_update_time'; + +-- 执行被绑定的查询 +select * from t; + +-- 通过查看系统变量 last_plan_from_binding 展示上一条查询是否使用了 Binding +select @@last_plan_from_binding; + +-- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding +explain select * from t; +show warnings; +``` + ## 自动捕获绑定 (Baseline Capturing) 通过将 `tidb_capture_plan_baselines` 的值设置为 `on`(其默认值为 `off`)可以打开自动捕获绑定功能。 From 7e42816a2826ad81af7447cfb1098be53ccf26f4 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Wed, 4 Aug 2021 18:14:59 +0800 Subject: [PATCH 06/20] Update sql-plan-management.md --- sql-plan-management.md | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 0b217cb615f7..17e52d1274c6 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -197,14 +197,6 @@ SELECT [SESSION] @@last_plan_from_binding; 该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 -{{< copyable "sql" >}} - -```sql -SHOW [SESSION] STATUS LIKE 'last_plan_binding_update_time'; -``` - -该语句使用状态变量 last_plan_binding_update_time 显示当前机器中 Binding 上一次的更新时间。其中 last_plan_binding_update_time 的默认值是 '0000-00-00 00:00:00'。 - 另外,当我们使用 explain 语句查看 SQL 的查询计划时,如果该 SQL 使用了 Binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 Binding。 ``` @@ -220,12 +212,6 @@ show global bindings; -- 查看上一次 Binding 更新的时间,对比上一条语句的查询结果可以发现其展示的值是 Binding 最新更新的时间 show status like 'last_plan_binding_update_time'; --- 执行被绑定的查询 -select * from t; - --- 通过查看系统变量 last_plan_from_binding 展示上一条查询是否使用了 Binding -select @@last_plan_from_binding; - -- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding explain select * from t; show warnings; @@ -275,7 +261,7 @@ set global tidb_evolve_plan_baselines = on; > **注意:** > -> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请与 PingCAP 的技术支持联系获取相关支持。 +> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它关闭,如发现 Binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From cdb2f3cc23bbfab3d38355a6adfacede49caf907 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Thu, 5 Aug 2021 18:00:05 +0800 Subject: [PATCH 07/20] Update sql-plan-management.md --- sql-plan-management.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 17e52d1274c6..58a7708a771c 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -165,6 +165,10 @@ explain select * from t1,t2 where t1.id = t2.id; 在这里 SESSION 作用域内被删除掉的绑定会屏蔽 GLOBAL 作用域内相应的绑定,优化器不会为 `select` 语句添加 `sm_join(t1, t2)` hint,`explain` 给出的执行计划中最上层节点并不被 hint 固定为 MergeJoin,而是由优化器经过代价估算后自主进行选择。 +> **注意:** +> +> 每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)后台的线程会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的状态为 `deleted` 的 binding 的回收清除操作。 + ### 查看绑定 {{< copyable "sql" >}} @@ -206,12 +210,6 @@ create global binding for using select * from t; --- 查看所有的 Binding -show global bindings; - --- 查看上一次 Binding 更新的时间,对比上一条语句的查询结果可以发现其展示的值是 Binding 最新更新的时间 -show status like 'last_plan_binding_update_time'; - -- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding explain select * from t; show warnings; From 5d46298166ad8d7c69039bec00c549c870bd1838 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Thu, 5 Aug 2021 18:36:51 +0800 Subject: [PATCH 08/20] Update sql-plan-management.md Co-authored-by: Kenan Yao --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 58a7708a771c..130fa83365bf 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -167,7 +167,7 @@ explain select * from t1,t2 where t1.id = t2.id; > **注意:** > -> 每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)后台的线程会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的状态为 `deleted` 的 binding 的回收清除操作。 +> 执行 DROP GLOBAL BINDING 会将当前 tidb-server 缓存中的绑定删除,并将系统表中对应行的状态修改为 'deleted'。该命令不会直接将系统表记录删除的原因是,其他 tidb-server 需要读取这个 'deleted' 状态来删除其缓存中对应的绑定。对于这些系统表中状态为 'deleted' 的记录,后台线程每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的绑定(确保所有 tidb-server 已经读去过这个 'deleted' 状态并更新完缓存)的回收清除操作。 ### 查看绑定 From 81df9e1f2855ae170b2525ee91db5242e8e38ea8 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Mon, 9 Aug 2021 15:18:25 +0800 Subject: [PATCH 09/20] Update sql-plan-management.md Co-authored-by: Kenan Yao --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 130fa83365bf..0e02b6ab9263 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -167,7 +167,7 @@ explain select * from t1,t2 where t1.id = t2.id; > **注意:** > -> 执行 DROP GLOBAL BINDING 会将当前 tidb-server 缓存中的绑定删除,并将系统表中对应行的状态修改为 'deleted'。该命令不会直接将系统表记录删除的原因是,其他 tidb-server 需要读取这个 'deleted' 状态来删除其缓存中对应的绑定。对于这些系统表中状态为 'deleted' 的记录,后台线程每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的绑定(确保所有 tidb-server 已经读去过这个 'deleted' 状态并更新完缓存)的回收清除操作。 +> 执行 DROP GLOBAL BINDING 会将当前 tidb-server 缓存中的绑定删除,并将系统表中对应行的状态修改为 'deleted'。该命令不会直接将系统表记录删除的原因是,其他 tidb-server 需要读取这个 'deleted' 状态来删除其缓存中对应的绑定。对于这些系统表中状态为 'deleted' 的记录,后台线程每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的绑定(确保所有 tidb-server 已经读取过这个 'deleted' 状态并更新完缓存)的回收清除操作。 ### 查看绑定 From f73ea847492e5308b2d691a5df77832e5a89bb21 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan Date: Mon, 9 Aug 2021 15:22:42 +0800 Subject: [PATCH 10/20] Update sql-plan-management.md --- sql-plan-management.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 0e02b6ab9263..df5f990d14dc 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -201,7 +201,7 @@ SELECT [SESSION] @@last_plan_from_binding; 该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 -另外,当我们使用 explain 语句查看 SQL 的查询计划时,如果该 SQL 使用了 Binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 Binding。 +另外,当我们使用 explain format = 'verbose' 语句查看 SQL 的查询计划时,如果该 SQL 使用了 binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 binding。 ``` -- 创建一个 global binding @@ -210,8 +210,9 @@ create global binding for using select * from t; --- 使用 explain 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 Binding -explain select * from t; +-- 使用 explain format = 'verbose' +语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 binding +explain format = 'verbose' select * from t; show warnings; ``` From 129526a1a787de04c5334d12606c672cf73683c1 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:50:15 +0800 Subject: [PATCH 11/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index df5f990d14dc..e3ceafa12c7e 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -167,7 +167,7 @@ explain select * from t1,t2 where t1.id = t2.id; > **注意:** > -> 执行 DROP GLOBAL BINDING 会将当前 tidb-server 缓存中的绑定删除,并将系统表中对应行的状态修改为 'deleted'。该命令不会直接将系统表记录删除的原因是,其他 tidb-server 需要读取这个 'deleted' 状态来删除其缓存中对应的绑定。对于这些系统表中状态为 'deleted' 的记录,后台线程每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)会触发一次对 update_time 在 10 个 `bind-info-lease` 以前的绑定(确保所有 tidb-server 已经读取过这个 'deleted' 状态并更新完缓存)的回收清除操作。 +> 执行 `DROP GLOBAL BINDING` 会删除当前 tidb-server 实例缓存中的绑定,并将系统表中对应行的状态修改为 'deleted'。该语句不会直接删除系统表中的记录,因为其他 tidb-server 实例需要读取系统表中的 'deleted' 状态来删除其缓存中对应的绑定。对于这些系统表中状态为 'deleted' 的记录,后台线程每隔 100 个 `bind-info-lease`(默认值为 `3s`,合计 `300s`)会触发一次对 `update_time` 在 10 个 `bind-info-lease` 以前的绑定(确保所有 tidb-server 实例已经读取过这个 'deleted' 状态并更新完缓存)的回收清除操作。 ### 查看绑定 From b4200cd5f5c383ac07671efab86866aa312d19c7 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:50:23 +0800 Subject: [PATCH 12/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index e3ceafa12c7e..a2841ea37614 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -191,7 +191,7 @@ SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; | collation | 排序规则 | | source | 创建方式,包括 manual (由 `create [global] binding` 生成)、capture(由 tidb 自动创建生成)和 evolve (由 tidb 自动演进生成) | -### 绑定的排查 +### 排查绑定 {{< copyable "sql" >}} From e8a5f1fb7805eeb5bed7c1f40bf662aa69ec255f Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:51:07 +0800 Subject: [PATCH 13/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index a2841ea37614..caf58fe35efa 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -201,7 +201,7 @@ SELECT [SESSION] @@last_plan_from_binding; 该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 -另外,当我们使用 explain format = 'verbose' 语句查看 SQL 的查询计划时,如果该 SQL 使用了 binding,explain 语句会产生 warning,我们可以通过查看 warning 了解 SQL 使用了哪一条 binding。 +另外,当使用 `explain format = 'verbose'` 语句查看一条 SQL 语句的查询计划时,如果该 SQL 语句使用了 binding,`explain` 语句会输出 warning 警告。此时可以通过查看 warning 了解该 SQL 语句使用了哪一条 binding。 ``` -- 创建一个 global binding From 8968b6979749d5a81c532f065783dc983c1b78e7 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:51:20 +0800 Subject: [PATCH 14/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index caf58fe35efa..a949dfb9e859 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -205,13 +205,14 @@ SELECT [SESSION] @@last_plan_from_binding; ``` -- 创建一个 global binding + create global binding for select * from t using select * from t; --- 使用 explain format = 'verbose' -语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 binding +-- 使用 explain format = 'verbose' 语句查看 SQL 的执行计划,通过查看 warning 信息确认查询所使用的 binding + explain format = 'verbose' select * from t; show warnings; ``` From 414acd522410535e86c055979e22944e72d7d718 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:51:29 +0800 Subject: [PATCH 15/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index a949dfb9e859..7c017ee8b197 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -259,7 +259,7 @@ set global tidb_evolve_plan_baselines = on; `tidb_evolve_plan_baselines` 的默认值为 `off`。 -> **注意:** +> **警告:** > > 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它关闭,如发现 Binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 From d7876491b35ea6df9d2efdab894fa02bb681c1a3 Mon Sep 17 00:00:00 2001 From: Chengpeng Yan <41809508+Reminiscent@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:51:47 +0800 Subject: [PATCH 16/20] Update sql-plan-management.md Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- sql-plan-management.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 7c017ee8b197..75cf3a90763d 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -261,7 +261,9 @@ set global tidb_evolve_plan_baselines = on; > **警告:** > -> 自动演进功能目前为实验特性,存在未知风险并需要继续优化,不建议在生产环境中使用。此开关将被禁用直到该功能到达 GA (Generally Available) 状态,如果尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它关闭,如发现 Binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 +> 自动演进功能目前为实验特性,存在未知风险,不建议在生产环境中使用。 +> +> 此变量开关已强制关闭,直到该自动演进成为正式功能 GA (Generally Available)。如果你尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它禁用。如发现 binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From 4efea7343e1647d889d3d0547f283e34b956862b Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Wed, 11 Aug 2021 13:38:26 +0800 Subject: [PATCH 17/20] Update sql-plan-management.md --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 75cf3a90763d..10b5c1a7c354 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -199,7 +199,7 @@ SHOW [GLOBAL | SESSION] BINDINGS [ShowLikeOrWhere]; SELECT [SESSION] @@last_plan_from_binding; ``` -该语句使用系统变量 [last_plan_from_binding](https://docs.pingcap.com/zh/tidb/stable/system-variables#last_plan_from_binding-%E4%BB%8E-v40-%E7%89%88%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%BC%95%E5%85%A5) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 +该语句使用系统变量 [`last_plan_from_binding`](/system-variables.md#last_plan_from_binding-从-v40-版本开始引入) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 另外,当使用 `explain format = 'verbose'` 语句查看一条 SQL 语句的查询计划时,如果该 SQL 语句使用了 binding,`explain` 语句会输出 warning 警告。此时可以通过查看 warning 了解该 SQL 语句使用了哪一条 binding。 From 185a35f6abfa9077d4a23a4f580d6c0d93b647d8 Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Wed, 11 Aug 2021 13:39:51 +0800 Subject: [PATCH 18/20] minor fix --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 10b5c1a7c354..7e8f0113cefc 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -263,7 +263,7 @@ set global tidb_evolve_plan_baselines = on; > > 自动演进功能目前为实验特性,存在未知风险,不建议在生产环境中使用。 > -> 此变量开关已强制关闭,直到该自动演进成为正式功能 GA (Generally Available)。如果你尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它禁用。如发现 binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 +> 此变量开关已强制关闭,直到自动演进成为正式功能 GA (Generally Available)。如果你尝试打开开关,会产生报错。如果你已经在生产环境中使用了此功能,请尽快将它禁用。如发现 binding 状态不如预期,请与 PingCAP 的技术支持联系获取相关支持。 在打开自动演进功能后,如果优化器选出的最优执行计划不在之前绑定的执行计划之中,会将其记录为待验证的执行计划。每隔 `bind-info-lease`(默认值为 `3s`),会选出一个待验证的执行计划,将其和已经绑定的执行计划中代价最小的比较实际运行时间。如果待验证的运行时间更优的话(目前判断标准是运行时间小于等于已绑定执行计划运行时间的 2/3),会将其标记为可使用的绑定。以下示例描述上述过程。 From 5c8d2348e37e444d52c40760ee53186b037f0b23 Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Wed, 11 Aug 2021 13:40:06 +0800 Subject: [PATCH 19/20] Update sql-plan-management.md --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 7e8f0113cefc..56ebdb137f9b 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -203,7 +203,7 @@ SELECT [SESSION] @@last_plan_from_binding; 另外,当使用 `explain format = 'verbose'` 语句查看一条 SQL 语句的查询计划时,如果该 SQL 语句使用了 binding,`explain` 语句会输出 warning 警告。此时可以通过查看 warning 了解该 SQL 语句使用了哪一条 binding。 -``` +```sql -- 创建一个 global binding create global binding for From 883d037a0ac891c9fce274c1c5fcd8d4adcc3f2b Mon Sep 17 00:00:00 2001 From: TomShawn <41534398+TomShawn@users.noreply.github.com> Date: Wed, 11 Aug 2021 13:41:55 +0800 Subject: [PATCH 20/20] fix typo --- sql-plan-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-plan-management.md b/sql-plan-management.md index 56ebdb137f9b..c36e101a3bf4 100644 --- a/sql-plan-management.md +++ b/sql-plan-management.md @@ -201,7 +201,7 @@ SELECT [SESSION] @@last_plan_from_binding; 该语句使用系统变量 [`last_plan_from_binding`](/system-variables.md#last_plan_from_binding-从-v40-版本开始引入) 显示上一条执行的语句所使用的执行计划是否来自 binding 的执行计划。 -另外,当使用 `explain format = 'verbose'` 语句查看一条 SQL 语句的查询计划时,如果该 SQL 语句使用了 binding,`explain` 语句会输出 warning 警告。此时可以通过查看 warning 了解该 SQL 语句使用了哪一条 binding。 +另外,当使用 `explain format = 'verbose'` 语句查看一条 SQL 语句的查询计划时,如果该 SQL 语句使用了 binding,`explain` 语句会输出 warning 警告。此时可以通过查看 warning 了解该 SQL 语句使用了哪一条 binding。 ```sql -- 创建一个 global binding