统计信息收集后,可以根据 DBA_OB_TABLE_STAT_STALE_INFO 的 LAST_ANALYZED 字段,判定出一个计划生成过程中使用的统计信息是否被更新了。如果被更新了,那么默认就会淘汰对应表在 Plan Cache 中包含的查询计划。 重新生成计划需要将 SQL 中涉及到的表的统计信息相关信息拉到 KVCACHE 中,如果对应 SQL 的硬解析时间比较久,还有可能导致 SQL 硬解析时间长,对 RT 敏感的业务造成影响。 此外,在 V4.2.5 BP5/V4.3.5 BP3 之前的版本,还存在计划淘汰后,并发执行的相同 SQL(同 SQL_ID),会多个线程并发生成同一条 SQL 的计划的情况,进而造成大量并发执行,资源瓶颈的情况。 如果此张表涉及到的计划比较固定,想要避免收集统计信息之后,刷新 Plan Cache 带来的 SQL 硬解析影响,可以将表的 NO_INVALIDATE=TRUE,那么这个统计信息暂时不需要触发执行计划的淘汰。
详细说明
具体可以通过 call dbms_stats.get_prefs('NO_INVALIDATE','DB','Table') from dual; 确认当前表的 NO_INVALIDATE 的值,然后执行 call dbms_stats.set_table_prefs('DB','Table','NO_INVALIDATE','TRUE') from dual; 设置对应的属性。
OceanBase(root@TEST)> select dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') from dual;
+------------------------------------------------------------------+
| dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') |
+------------------------------------------------------------------+
| DBMS_STATS.AUTO_INVALIDATE |
+------------------------------------------------------------------+
1 row in set (3.718 sec)
OceanBase(root@TEST)> CALL dbms_stats.set_table_prefs('TEST', 'T1', 'NO_INVALIDATE', 'TRUE');
Query OK, 0 rows affected (0.540 sec)
OceanBase(root@TEST)> select dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') from dual;
+------------------------------------------------------------------+
| dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') |
+------------------------------------------------------------------+
| TRUE |
+------------------------------------------------------------------+
1 row in set (0.039 sec)
OceanBase(root@TEST)> CALL dbms_stats.set_table_prefs('TEST', 'T1', 'NO_INVALIDATE', 'FALSE');
Query OK, 0 rows affected (0.064 sec)
OceanBase(root@TEST)> select dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') from dual;
+------------------------------------------------------------------+
| dbms_stats.get_prefs('NO_INVALIDATE', 'TEST', 'T1') |
+------------------------------------------------------------------+
| FALSE |
+------------------------------------------------------------------+
1 row in set (0.036 sec)
适用版本
OceanBase 数据库 V4.x 版本。