- 索引使用情况
- 未使用预期索引
- 如果在执行计划中,查询没有使用应该被使用的索引(基于对查询和表结构的了解),这可能是统计信息不准确导致的。例如,对于一个经常在
WHERE
子句中根据某列进行筛选的查询,该列上存在合适的索引,但执行计划显示进行了全表扫描而不是索引查找。这可能是因为统计信息中关于该列的基数等信息错误,导致查询优化器认为使用索引的成本高于全表扫描。
- 如果在执行计划中,查询没有使用应该被使用的索引(基于对查询和表结构的了解),这可能是统计信息不准确导致的。例如,对于一个经常在
- 索引选择不合理
- 当表有多个索引时,执行计划中选择的索引不符合预期也可能暗示统计信息有问题。比如,存在一个复合索引
(column1, column2)
,根据业务逻辑和数据特点,查询应该优先使用这个复合索引,但执行计划却选择了另一个索引或者没有选择任何索引。这可能是由于统计信息对索引列的选择性(不同值的数量与表总行数的比值)计算错误,使得优化器做出了错误的决策。
- 当表有多个索引时,执行计划中选择的索引不符合预期也可能暗示统计信息有问题。比如,存在一个复合索引
- 未使用预期索引
- 表连接顺序和方式
- 不合理的连接顺序
- 在多表连接的查询中,执行计划显示的连接顺序不符合预期时,可能需要重新收集统计信息。例如,有三个表
A
、B
、C
,根据表的数据量和业务逻辑,合理的连接顺序应该是先连接A
和B
,再连接C
。但执行计划显示的连接顺序是先连接B
和C
,然后再连接A
,这可能是因为统计信息中关于表的数据量等信息不准确,导致优化器选择了错误的连接顺序。
- 在多表连接的查询中,执行计划显示的连接顺序不符合预期时,可能需要重新收集统计信息。例如,有三个表
- 不恰当的连接方式
- 如果执行计划中选择的连接方式(如内连接、外连接等)看起来不符合查询的逻辑需求,这也可能与统计信息有关。例如,一个查询只需要获取匹配的记录,应该使用内连接,但执行计划显示使用了外连接,并且查询性能较差。这可能是由于统计信息中的数据分布等信息错误,使优化器误判了连接方式的选择。
- 不合理的连接顺序
- 预估数据量与实际情况差异
- 操作涉及的数据量
- 在执行计划中,数据库会预估每个操作(如过滤、连接等)涉及的数据量。如果这些预估数据量与实际情况有很大差异,可能需要重新收集统计信息。例如,执行计划显示一个
WHERE
子句的过滤操作预估会筛选出很少的数据,但实际上该条件筛选出了大量数据或者反之。这可能是因为统计信息中的数据分布、列基数等信息不准确,导致优化器对数据量的预估错误。
- 在执行计划中,数据库会预估每个操作(如过滤、连接等)涉及的数据量。如果这些预估数据量与实际情况有很大差异,可能需要重新收集统计信息。例如,执行计划显示一个
- 中间结果集大小
- 对于多步查询操作,中间结果集的大小在执行计划中也有预估。如果中间结果集的预估大小与实际运行时的情况相差很大,这可能是统计信息不准确的表现。例如,在一个连接操作后,执行计划预估的中间结果集很小,但实际运行时产生了一个非常大的中间结果集,这可能导致后续操作(如排序、分组等)的性能下降,此时可能需要重新收集统计信息。
- 操作涉及的数据量
- 操作成本估计
- 成本比例异常
- 执行计划中会显示各个操作的成本估计,包括CPU成本、I/O成本等。如果某些操作的成本比例与预期相差很大,可能是统计信息的问题。例如,一个简单的索引查找操作在执行计划中的成本估计非常高,而一个复杂的连接操作成本估计却很低,这与正常的操作成本预期不符。这可能是由于统计信息不准确,使得优化器对操作的成本计算错误,这种情况下可能需要重新收集统计信息来纠正优化器的决策。
- 成本比例异常