我们知道收集统计信息的目的是减少优化器被过时统计信息误导的可能性。在Oracle数据库12c引入了CREATE TABLE的在线统计信息收集,典型的比如CTAS(create table as select)和IIS(insert into select) using Direct-Path Inserts这些类型的操作。
在Oracle Database 19c引入了实时统计(Real-Time Statistics),它扩展了对常规DML语句的在线支持。由于DBMS_STATS作业之间的统计信息可能会过时,因此实时统计信息有助于优化器生成更优化的计划。
虽然创建或重建索引时、批量加载操作会收集必要的统计信息,但实时统计信息只是对传统统计信息的补充,而不是替代。由于这个原因,您必须继续使用DBMS_STATS定期收集统计信息,最好使用AutoTask作业。在19c中,这个特性只能在Exadata上使用,这个特性默认是启用的。如果没有Exadata环境,可通过设置参数"_exadata_feature_on"=true来模拟。请不要在非Exadta生产环境上使用,切记,切记!!!
如果想禁用(修改参数_optimizer_gather_stats_on_conventional_dml=false),请参考Note2577100.1:Disabling Real-time Statistics In 19c
由于Real-Time Statistics特性是缺省启用的,无需任何配置。如果不想收集,可以通过HINT NO_GATHER_OPTIMIZER_STATISTICS来阻止。
在20c中,引入了optimizer_real_time_statistics参数来控制
当OPTIMIZER_REAL_TIME_STATISTICS初始化参数设置为true时,Oracle数据库在常规DML操作期间自动收集实时统计信息。默认设置为false,这意味着禁用实时统计。
我们也可以通过两个视图来查看,是否使用了real time statistics
*_TAB_COL_STATISTICS
*_TAB_STATISTICS
如果NOTES字段显示为STATS_ON_CONVENTIONAL_DML,则说明使用了real-time statistics,这个字段在19c之后才有。
常见问题
如果测试时,发现没有使用,也不要着急。由于这些信息缓存在SGA的Buffer中,缺省每隔15分钟会写入数据字典,可以通过如下过程刷新。
SQL>EXEC DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO;
更多的关于统计信息的,请参考我同事写的微文
https://mp.weixin.qq.com/s/EzOxdlZRVzZMeFH0gdBLRAReference
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/optimizer-statistics-concepts.html#GUID-769E609D-0312-43A7-9581-3F3EACF10BA9
https://docs.oracle.com/en/database/oracle/oracle-database/20/refrn/ALL_TAB_COL_STATISTICS.html#GUID-40AC6263-089D-4471-B2E2-EBCA15BC4C65
https://docs.oracle.com/en/database/oracle/oracle-database/19/tgsql/influencing-the-optimizer.html#GUID-C1C85DEA-3583-40FE-B5BB-6AC8F76FFE34
https://docs.oracle.com/en/database/oracle/oracle-database/20/tgsql/influencing-the-optimizer.html#GUID-C1C85DEA-3583-40FE-B5BB-6AC8F76FFE34
Note2577100.1:Disabling Real-time Statistics In 19c
FAQ: Statistics Gathering Frequently Asked Questions (Doc ID 1501712.1)