未收集统计信息导致查询性能差
问题现象
SQL查询性能差,对语句执行EXPLAIN VERBOSE时有Warning信息。
原因分析
查询中涉及到的表或列没有收集统计信息。统计信息是优化器生成执行计划的基础,没有收集统计信息,优化器生成的执行计划会非常差,如果统计信息未收集,会导致多种多样表现形式的性能问题。例如,等值关联走NestLoop,大表broadcast,集群CPU持续增高等问题。
分析过程
- 通过EXPLAIN VERBOSE/EXPLAIN PERFORMANCE打印语句的执行计划。
执行计划中会有语句未收集统计信息的告警,并且通常E-rows估算非常小。
- 上述例子中,在打印的执行计划中有Warning提示信息,提示有哪些列在这个执行计划中用到了,但是这些列没有统计信息。
在CN的pg_log日志中也有会有类似的Warning信息。同时,E-rows会比实际值小很多。
处理方法
周期性地运行ANALYZE,或者在对表的大部分内容执行更改操作后立即执行ANALYZE。