引用>
虽然优化器需要准确的统计信息来选择最优的执行计划,但是有些场景下,收集统计信息比较困难,或消耗资源较高,或收集统计信息不能及时完成,那么就需要另一种备选策略。
不稳定的表
不稳定的表即随着时间的变化,数据会发生巨大变化的表,例如,一个订单队列表,一天的开始它是空的,随着时间推移,订单会填满这个表,一旦某一订单被处理又会从这个订单表中删除,一天的结尾表又会变为空。
如果你依赖于自动收集统计信息工作来维护这类表的统计信息,那么统计信息会经常显示此表为空。因为晚上此表是空的,而收集统计信息的工作也正是晚上才开始执行。然而,在白天的过程中,这个表可能有成百上千条记录只
在这种情况下,最好在表被填充时收集一组有的代表性的统计信息,并锁住,锁住统计信息会阻止自动收集的统计信息覆盖他们。另外,你可以依赖于动态采样来收集这些表的统计信息。优化器在优化一个语句之前编sql语译句的时候会使用动态采样来收集表的基本统计信息。尽管动态采样收集的统计信息没有完全由DBMS_STATS包收集的统计信息质量高,但在大多数情况下他们已经足够好了。
全局临时表
在应用程序上下文中,全局临时表经常被用于存储中间结果。全局临时表在系统级别与具有适当权限的所有用户共享其定义,但里面的数据内容在会话之间是相互独立和私有的。针对此表,直到有数据插入时才会分配物理存储。
一个全局临时表可以是事务特定的(提交时删除行记录),也可以是会话特定的(提交时保留行记录)。收集事务特定表的统计信息会导致此表被清空。相反,收集一个全局临时表的统计信息是可能的(会保留行记录),但是在之前的数据库版本这不是一个好方案,因为使用全局临时表的所有会话不得不共用同一组统计信息,以致于很多系统依赖于动态采样的统计信息。
然而,在oracle 12 c版本,现在可以实现每个使用全局临时表的会话拥有自己独立的统计信息。全局临时表上的统计信息是否共享取决于DBMS_STATS包的一个新选项GLOBAL_TEMP_TABLE_STATS。默认情况此选项设置为会话,即每个使用全局临时表的会话都有自己独立的统计信息。优化器会首先使用会话的统计信息,如果会话统计信息不存在,才会使用共享的统计信息。