Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

*: make the expressions of GlobalStats consistent #18524

Merged
merged 8 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion optimizer-fix-controls.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ SET SESSION tidb_opt_fix_control = '44262:ON,44389:ON';

- 默认值:`OFF`
- 可选值:`ON`、`OFF`
- 是否允许在缺少 [GlobalStats](/statistics.md#收集动态裁剪模式下的分区表统计信息) 的情况下使用[动态裁剪模式](/partitioned-table.md#动态裁剪模式)访问分区表
- 在分区表缺少[全局统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)的情况下,是否允许使用[动态裁剪模式](/partitioned-table.md#动态裁剪模式)访问该表

### [`44389`](https://github.com/pingcap/tidb/issues/44389) <span class="version-mark">从 v6.5.3 和 v7.2.0 版本开始引入</span>

Expand Down
2 changes: 1 addition & 1 deletion partitioned-table.md
Original file line number Diff line number Diff line change
Expand Up @@ -1896,7 +1896,7 @@ select * from t;

### 动态裁剪模式

TiDB 访问分区表有两种模式,`dynamic` 和 `static`。从 v6.3.0 开始,默认使用 `dynamic` 模式。但是注意,`dynamic` 模式仅在表级别汇总统计信息(即 GlobalStats)收集完成的情况下生效。如果选择了 `dynamic` 但 GlobalStats 未收集完成,TiDB 会仍采用 `static` 模式。关于 GlobalStats 更多信息,请参考[动态裁剪模式下的分区表统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)。
TiDB 访问分区表有两种模式,`dynamic` 和 `static`。从 v6.3.0 开始,默认使用 `dynamic` 模式。但是注意,`dynamic` 模式仅在表级别汇总统计信息(即分区表的全局统计信息)收集完成的情况下生效。如果在全局统计信息未收集完成的情况下启用 `dynamic` 动态裁剪模式,TiDB 仍然会维持 `static` 静态裁剪的状态,直到全局统计信息收集完成。关于全局统计信息的更多信息,请参考[动态裁剪模式下的分区表统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)。

{{< copyable "sql" >}}

Expand Down
4 changes: 2 additions & 2 deletions releases/release-6.3.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ TiDB 版本:6.3.0-DMR

正式支持对在线 TiKV 节点[关闭 Titan 引擎](/storage-engine/titan-configuration.md#关闭-titan)。

* 缺少 GlobalStats 时自动选择分区静态剪裁 [#37535](https://github.com/pingcap/tidb/issues/37535) @[Yisaer](https://github.com/Yisaer)
* 缺少全局统计信息时自动选择分区静态剪裁 [#37535](https://github.com/pingcap/tidb/issues/37535) @[Yisaer](https://github.com/Yisaer)

当启用分区[动态剪裁](/partitioned-table.md#动态裁剪模式)时,优化器依赖 [GlobalStats](/statistics.md#收集动态裁剪模式下的分区表统计信息) 进行执行计划的选择。在 [GlobalStats](/statistics.md#收集动态裁剪模式下的分区表统计信息) 收集完成前,使用 pseudo 统计信息可能会造成性能回退。在 v6.3.0 版本中,如果在 [GlobalStats](/statistics.md#收集动态裁剪模式下的分区表统计信息) 收集未完成的情况下打开动态分区裁剪开关,TiDB 会维持静态分区剪裁的状态,直到 GlobalStats 收集完成。该方式确保在切换分区剪裁策略时系统性能保持稳定
当启用分区[动态裁剪](/partitioned-table.md#动态裁剪模式)时,优化器依赖[全局统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)进行执行计划的选择。在[全局统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)收集完成前,使用 pseudo 统计信息可能会造成性能回退。在 v6.3.0 版本中,如果在[全局统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)未收集完成的情况下启用 `dynamic` 动态裁剪模式,TiDB 仍然会维持 `static` 静态裁剪的状态,直到全局统计信息收集完成。该方式确保在切换分区裁剪策略时系统性能保持稳定

### 易用性

Expand Down
2 changes: 1 addition & 1 deletion releases/release-6.5.10.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ TiDB 版本:6.5.10
- 修复 `INFORMATION_SCHEMA.TIDB_TRX` 表中 `STATE` 字段的 `size` 未定义导致 `STATE` 显示为空的问题 [#53026](https://github.com/pingcap/tidb/issues/53026) @[cfzjywxk](https://github.com/cfzjywxk)
- 修复创建带有外键的表时,TiDB 未创建对应的统计信息元信息 (`stats_meta`) 的问题 [#53652](https://github.com/pingcap/tidb/issues/53652) @[hawkingrei](https://github.com/hawkingrei)
- 修复在查询并发较高时,统计信息同步加载机制可能意外加载失败的问题 [#52294](https://github.com/pingcap/tidb/issues/52294) @[hawkingrei](https://github.com/hawkingrei)
- 修复 GlobalStats 中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复分区表的全局统计信息中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复重启 TiDB 后,主键列统计信息中的直方图和 TopN 未被加载的问题 [#37548](https://github.com/pingcap/tidb/issues/37548) @[hawkingrei](https://github.com/hawkingrei)
- 修复查询中的某些过滤条件可能导致 planner 模块发生 `invalid memory address or nil pointer dereference` 报错的问题 [#53582](https://github.com/pingcap/tidb/issues/53582) [#53580](https://github.com/pingcap/tidb/issues/53580) [#53594](https://github.com/pingcap/tidb/issues/53594) [#53603](https://github.com/pingcap/tidb/issues/53603) @[YangKeao](https://github.com/YangKeao)
- 修复使用 `PREPARE`/`EXECUTE` 方式执行带 `CONV` 表达式的语句,且 `CONV` 表达式包含 `?` 参数时,多次执行可能导致查询结果错误的问题 [#53505](https://github.com/pingcap/tidb/issues/53505) @[qw4990](https://github.com/qw4990)
Expand Down
2 changes: 1 addition & 1 deletion releases/release-7.3.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ v7.3.0 引入了以下主要功能。[功能详情](#功能详情)中列出的
| [`tidb_allow_tiflash_cop`](/system-variables.md#tidb_allow_tiflash_cop-从-v730-版本开始引入) | 新增 | 用于在 TiDB 给 TiFlash 下推计算任务时选择生成执行计划的协议。 |
| [`tidb_lock_unchanged_keys`](/system-variables.md#tidb_lock_unchanged_keys-从-v711-和-v730-版本开始引入) | 新增 | 用于控制部分场景下,对于事务中涉及但并未修改值的 key 是否进行上锁。 |
| [`tidb_opt_enable_non_eval_scalar_subquery`](/system-variables.md#tidb_opt_enable_non_eval_scalar_subquery-从-v730-版本开始引入) | 新增 | 这个变量用于控制 `EXPLAIN` 语句是否禁止提前执行可以在优化阶段展开的常量子查询。 |
| [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) | 新增 | 这个变量用于控制当分区统计信息缺失时生成 GlobalStats 的行为。 |
| [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) | 新增 | 这个变量用于控制当分区统计信息缺失时生成分区表的全局统计信息的行为。 |
| [`tiflash_replica_read`](/system-variables.md#tiflash_replica_read-从-v730-版本开始引入) | 新增 | 这个变量用于设置当查询需要使用 TiFlash 引擎时,TiFlash 副本的选择策略。 |

### 配置文件参数
Expand Down
2 changes: 1 addition & 1 deletion releases/release-7.5.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ TiDB 7.5.0 为长期支持版本 (Long-Term Support Release, LTS)。

+ TiDB

- 优化合并 GlobalStats 的并发模型:引入 [`tidb_enable_async_merge_global_stats`](/system-variables.md#tidb_enable_async_merge_global_stats-从-v750-版本开始引入) 实现同时加载统计信息并进行合并,从而加速分区表场景下 GlobalStats 的生成。同时优化合并 GlobalStats 的内存使用,以避免 OOM 并减少内存分配 [#47219](https://github.com/pingcap/tidb/issues/47219) @[hawkingrei](https://github.com/hawkingrei)
- 优化合并分区表的全局统计信息的并发模型:引入 [`tidb_enable_async_merge_global_stats`](/system-variables.md#tidb_enable_async_merge_global_stats-从-v750-版本开始引入) 实现同时加载统计信息并进行合并,从而加速分区表场景下全局统计信息的生成。同时优化合并全局统计信息的内存使用,以避免 OOM 并减少内存分配 [#47219](https://github.com/pingcap/tidb/issues/47219) @[hawkingrei](https://github.com/hawkingrei)
- 优化 `ANALYZE` 流程:引入 [`tidb_build_sampling_stats_concurrency`](/system-variables.md#tidb_build_sampling_stats_concurrency-从-v750-版本开始引入) 精细化控制 `ANALYZE` 并发度,减少资源消耗。同时优化 `ANALYZE` 的内存使用,通过复用部分中间结果,减少内存分配,避免频繁 GC [#47275](https://github.com/pingcap/tidb/issues/47275) @[hawkingrei](https://github.com/hawkingrei)
- 改进 Placement Policy 的使用:增加对全局范围的策略配置,完善常用场景的语法支持 [#45384](https://github.com/pingcap/tidb/issues/45384) @[nolouch](https://github.com/nolouch)
- 提升启用索引加速功能 `tidb_ddl_enable_fast_reorg` 后添加索引的性能,在内部测试中 v7.5.0 相比 v6.5.0 性能最高提升 62.5% [#47757](https://github.com/pingcap/tidb/issues/47757) @[tangenta](https://github.com/tangenta)
Expand Down
2 changes: 1 addition & 1 deletion releases/release-8.1.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ TiDB 版本:8.1.1
- 修复 `INFORMATION_SCHEMA.TIDB_TRX` 表中 `STATE` 字段的 `size` 未定义导致 `STATE` 显示为空的问题 [#53026](https://github.com/pingcap/tidb/issues/53026) @[cfzjywxk](https://github.com/cfzjywxk)
- 修复执行 `SELECT DISTINCT CAST(col AS DECIMAL), CAST(col AS SIGNED) FROM ...` 查询时结果出错的问题 [#53726](https://github.com/pingcap/tidb/issues/53726) @[hawkingrei](https://github.com/hawkingrei)
- 修复 DDL 错误使用 etcd 导致任务排队的问题 [#52335](https://github.com/pingcap/tidb/issues/52335) @[wjhuang2016](https://github.com/wjhuang2016)
- 修复 GlobalStats 中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复分区表的全局统计信息中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复在自动收集统计信息时,系统变量 `tidb_enable_async_merge_global_stats` 和 `tidb_analyze_partition_concurrency` 未生效的问题 [#53972](https://github.com/pingcap/tidb/issues/53972) @[hi-rustin](https://github.com/hi-rustin)
- 修复当第一个参数是 `month` 并且第二个参数是负数时,`TIMESTAMPADD()` 函数会进入无限循环的问题 [#54908](https://github.com/pingcap/tidb/issues/54908) @[xzhangxian1008](https://github.com/xzhangxian1008)
- 修复某些连接在握手完成之前退出导致 Grafana 监控指标中的连接数 (Connection Count) 不正确的问题 [#54428](https://github.com/pingcap/tidb/issues/54428) @[YangKeao](https://github.com/YangKeao)
Expand Down
2 changes: 1 addition & 1 deletion releases/release-8.2.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ TiDB 版本:8.2.0
- 修复查询中的某些过滤条件可能导致 planner 模块发生 `invalid memory address or nil pointer dereference` 报错的问题 [#53582](https://github.com/pingcap/tidb/issues/53582) [#53580](https://github.com/pingcap/tidb/issues/53580) [#53594](https://github.com/pingcap/tidb/issues/53594) [#53603](https://github.com/pingcap/tidb/issues/53603) @[YangKeao](https://github.com/YangKeao)
- 修复并发执行 `CREATE OR REPLACE VIEW` 可能报错 `table doesn't exist` 的问题 [#53673](https://github.com/pingcap/tidb/issues/53673) @[tangenta](https://github.com/tangenta)
- 修复 `INFORMATION_SCHEMA.TIDB_TRX` 表中 `STATE` 字段的 `size` 未定义导致 `STATE` 显示为空的问题 [#53026](https://github.com/pingcap/tidb/issues/53026) @[cfzjywxk](https://github.com/cfzjywxk)
- 修复关闭 `tidb_enable_async_merge_global_stats` 时,GlobalStats 中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复关闭 `tidb_enable_async_merge_global_stats` 时,分区表的全局统计信息中的 `Distinct_count` 信息可能错误的问题 [#53752](https://github.com/pingcap/tidb/issues/53752) @[hawkingrei](https://github.com/hawkingrei)
- 修复使用 Optimizer Hints 时,可能输出错误的 WARNINGS 信息的问题 [#53767](https://github.com/pingcap/tidb/issues/53767) @[hawkingrei](https://github.com/hawkingrei)
- 修复对时间类型执行取负操作结果不正确的问题 [#52262](https://github.com/pingcap/tidb/issues/52262) @[solotzg](https://github.com/solotzg)
- 修复 `REGEXP()` 函数对空模式参数未显式报错的问题 [#53221](https://github.com/pingcap/tidb/issues/53221) @[yibin87](https://github.com/yibin87)
Expand Down
2 changes: 1 addition & 1 deletion sql-statements/sql-statement-drop-stats.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ DROP STATS TableName PARTITION PartitionNameList;
Query OK, 0 rows affected (0.00 sec)
```

以下语句只删除指定表在动态裁剪模式下生成的 GlobalStats 统计信息
以下语句只删除指定表在动态裁剪模式下生成的全局统计信息

```sql
DROP STATS TableName GLOBAL;
Expand Down
14 changes: 7 additions & 7 deletions statistics.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,18 +179,18 @@ ANALYZE TABLE TableName INDEX [IndexNameList] [WITH NUM BUCKETS|TOPN|CMSKETCH DE

#### 收集动态裁剪模式下的分区表统计信息

在分区表开启[动态裁剪模式](/partitioned-table.md#动态裁剪模式)(从 v6.3.0 开始,默认开启)的情况下,TiDB 将收集表级别的汇总统计信息,以下称 GlobalStats。目前 GlobalStats 由分区统计信息合并汇总得到。在动态裁剪模式下,任何分区表的统计信息更新都可能触发 GlobalStats 更新
在分区表开启[动态裁剪模式](/partitioned-table.md#动态裁剪模式)(从 v6.3.0 开始,默认开启)的情况下,TiDB 将收集表级别的汇总统计信息,即分区表的全局统计信息。分区表的全局统计信息合并汇总了所有分区的统计信息。在动态裁剪模式下,表中任何分区的统计信息更新都可能触发该表全局统计信息的更新

如果分区为空,或者某些分区上的列缺失,那么统计信息收集行为将受 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 变量的控制:
如果某些分区的统计信息为空,或者某些分区中列的统计信息有缺失,那么统计信息收集行为将受 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 变量的控制:

- 当触发 GlobalStats 更新且 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 为 `OFF` 时:
- 当触发全局统计信息更新且 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 为 `OFF` 时:

- 如果某些分区缺失统计信息(例如从未进行过 analyze 的新分区),GlobalStats 生成会中断,并显示 warning 信息提示这些分区没有可用的统计信息。
- 如果某些分区中缺失某些列的统计信息(这些分区中指定了不同的列进行 analyze),当这些列的统计信息被合并汇总时,GlobalStats 生成会中断,并显示 warning 信息提示某些分区中缺少某些列的统计信息。
- 如果某些分区缺失统计信息(例如从未进行过 analyze 的新分区),全局统计信息生成会中断,并显示 warning 信息提示这些分区没有可用的统计信息。
- 如果某些分区中缺失某些列的统计信息(这些分区中指定了不同的列进行 analyze),当这些列的统计信息被合并汇总时,全局统计信息生成会中断,并显示 warning 信息提示某些分区中缺少某些列的统计信息。

- 当触发 GlobalStats 更新且 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 为 `ON` 时:
- 当触发全局统计信息更新且 [`tidb_skip_missing_partition_stats`](/system-variables.md#tidb_skip_missing_partition_stats-从-v730-版本开始引入) 为 `ON` 时:

- 如果某些分区缺失全部列或部分列的统计信息,TiDB 在生成 GlobalStats 时会跳过这些缺失的分区统计信息,不影响 GlobalStats 生成
- 如果某些分区缺失全部列或部分列的统计信息,TiDB 在生成全局统计信息时会跳过这些缺失的分区统计信息,不影响全局统计信息的生成

在动态裁剪模式下,分区和分区表的 `ANALYZE` 配置应保持一致。因此,如果在 `ANALYZE TABLE TableName PARTITION PartitionNameList` 语句后指定了 `COLUMNS` 配置或在 `WITH` 后指定了 `OPTIONS` 配置,TiDB 将忽略这些配置并返回 warning 信息提示。

Expand Down
8 changes: 4 additions & 4 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -4198,7 +4198,7 @@ SHOW WARNINGS;
- 类型:枚举型
- 默认值:`dynamic`
- 可选值:`static`、`dynamic`、`static-only`、`dynamic-only`
- 这个变量用来设置是否开启分区表动态裁剪模式。默认值为 `dynamic`。但是注意,`dynamic` 模式仅在表级别汇总统计信息(即 GlobalStats)收集完成的情况下生效。如果选择了 `dynamic` 但 GlobalStats 未收集完成,TiDB 会仍采用 `static` 模式。关于 GlobalStats 更多信息,请参考[动态裁剪模式下的分区表统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)。关于动态裁剪模式更多信息,请参考[分区表动态裁剪模式](/partitioned-table.md#动态裁剪模式)。
- 这个变量用来设置是否开启分区表动态裁剪模式。默认值为 `dynamic`。但是注意,`dynamic` 动态裁剪模式仅在表级别汇总统计信息(即分区表的全局统计信息)收集完成的情况下生效。如果在全局统计信息未收集完成的情况下启用 `dynamic` 动态裁剪模式,TiDB 仍然会维持 `static` 静态裁剪的状态,直到全局统计信息收集完成。关于全局统计信息的更多信息,请参考[动态裁剪模式下的分区表统计信息](/statistics.md#收集动态裁剪模式下的分区表统计信息)。关于动态裁剪模式的更多信息,请参考[分区表动态裁剪模式](/partitioned-table.md#动态裁剪模式)。

### `tidb_persist_analyze_options` <span class="version-mark">从 v5.4.0 版本开始引入</span>

Expand Down Expand Up @@ -4741,10 +4741,10 @@ Query OK, 0 rows affected, 1 warning (0.00 sec)
- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否
- 类型:布尔型
- 默认值:`ON`
- 分区表在开启[动态裁剪模式](/partitioned-table.md#动态裁剪模式)时,TiDB 会汇总各个分区的统计信息生成 GlobalStats。这个变量用于控制当分区统计信息缺失时生成 GlobalStats 的行为
- 分区表在开启[动态裁剪模式](/partitioned-table.md#动态裁剪模式)时,TiDB 会汇总各个分区的统计信息生成全局统计信息。这个变量用于控制当分区统计信息缺失时生成全局统计信息的行为

- 当开启该变量时,TiDB 生成 GlobalStats 时会跳过缺失的分区统计信息,不影响 GlobalStats 生成
- 当关闭该变量时,遇到缺失的分区统计信息,TiDB 会停止生成 GlobalStats
- 当开启该变量时,TiDB 生成全局统计信息时会跳过缺失的分区统计信息,不影响全局统计信息的生成
- 当关闭该变量时,遇到缺失的分区统计信息,TiDB 会停止生成全局统计信息

### `tidb_skip_utf8_check`

Expand Down
Loading