# [Known Issues] TiDB 中由于统计信息异步加载导致执行计划不稳定

## Key Words

TiDB, 执行计划不稳定, 统计信息, 异步加载

## Description

在表的统计信息健康度正常，统计信息更新时间也正常的情况下，会出现 SQL 的执行计划不稳定的情况。

## Root Cause

当前 TIDB 对统计信息加载方式的设计为：

系统启动时会将表、索引级统计信息加载到 stats cache 内，因此表和索引级的统计信息是常驻内存的，每隔 stats lease 时间，TiDB 会检查统计信息是否有更新，有的话被加载到内。

对于列的统计信息，其数据量较大占用的的内存较多，当有查询条件涉及到该列时，TiDB 才会将该列的统计信息加载到内存中，每隔 stats-lease 时间，会检查是否有列统计信息需要备加载到内存。

因此在列统计信息被需要而没有及时就绪时（异步加载过程中），TiDB 优化器会选择默认的统计信息进行代价估算，从而走到错误的执行计划。

## Diagnostic Steps

1. 多次执行 SQL ，不同版本执行计划中相同算子的 estRows 存在差异

2. 问题期间表的统计信息没有被更新过

## Resolution

1. 使用 Hint 固定执行计划

2. 考虑升级到 v5.4 及以后的版本开启 [同步加载统计信息](https://docs.pingcap.com/zh/tidb/dev/system-variables)（ **实验特性建议 GA 后再开启** ）

## Workaround

考虑修改 `tidb_stats_load_sync_wait` 和 `tidb_stats_load_pseudo_timeout` 变量设置，开启同步加载（实验特性）

## Affected Versions

All