1、问题 假如一套RAC环境,在8月5日的9:00—09:30时,2节点发生了CPU消耗非常高的情况,如果要分析是不是因为SQL_ID为bj75p9188y410 的语句的执行计划走错所致,这时,如果想用dbms_xplan.display_awr的简单查询方式来得到当时的执行计划,是无法实现的,那应该怎样查出该语句8月5日的9:00—09:30时第2节点上SQL_ID为bj75p9188y410的语句的执行计划是怎样子的呢?
2、分析
结果如下:
—
3
Plan hash value: 3990363694
3、解决方法3.1、查到8月5日9:00—09:30的 snap_id结果为:
—
—
33676
33676
3.2、通过dbms_xplan.display_awr 与包含snap_id、instance_number信息的视图关联得到8月5日9:00—09:30时SQL_ID为bj75p9188y410 的执行计划: 33676 table(dbms_xplan.display_awr(db_id=> 19948XXXX2,sql_id=> b.sql_id,plan_hash_value=> b.plan_hash_value)) a;结果如下:
此执行计划发生了严重的估算错误
其实还有一种方法:使用awrsqrpi.sql和awrsqrpt.sql可以做到,该方法不在本文论坛之列。
4、小结 通过上面查询结果可以得出,SQLID为的SQL语句,在AWR中总共保存有3种执行计划,但在在8月5日的9:00—09:30时第2节点上该语句的执行计划只有一种,选择了错误的执行计划。原因为统计信息不正确导致Rows估算错误,从而选择错误的执行计划。