在下面三种常见情形中,你最终会为同一个对象生成多组对象统计信息。
Ø 当你命令dbms_stats包(通过参数statown、stattab和statid)将当前对象统计信息保存到备份表中时。
Ø dbms_stats包被用于收集对象统计信息时。事实上,如8.9节所述,当收集一组新的统计信息时,程序包会自动保存对象统计信息的历史记录而不是简单地对其进行覆盖。
Ø 从11.1版本开始,当你收集挂起的统计信息时。
通常情况下你希望了解两组对象统计信息之间的不同。自10.2.0.4版本开始,你不再需要自己动手写查询语句完成这样的比较。可以简单地利用dbms_stats包提供的新函数。
下面的例子基于comparing_object_statistics.sql脚本输出,显示了此类报告:
P236
注意开头部分的内容,你可以看到用于比较的参数:模式和表的名称、两个比较源的定义(A和B)以及一个阈值。最后的这个参数指定是否只显示两组统计信息之间的差异(按百分比)达到指定阈值的那些对象统计信息。例如,如果你有两个值100和115,仅当阈值设置为15或者更低的时候它们才会被认为是不同的。默认的阈值是10。要显示所有的对象统计信息,可以使用值0。
下面是dbms_stats包中可以用来生成这样的报告的函数。
Ø diff_table_stats_in_stattab用于比较一张备份表(通过参数ownname和tabname指定)中的对象统计信息与当前对象统计信息之间的差异,或者比较其与另外一张备份表中的另一组信息之间的差异。参数stattab1、statid1以及stattab1own用来指定第一张备份表。第二张备份表(此处是可选的)是通过参数stattab2、statid2以及stattab2own指定的。如果第二张备份表的参数没有指定,或者它们被设置为NULL,那么当前对象统计信息就会与第一张备份表的对象统计信息进行比较。下面的例子将当前对象统计信息与一组存储在mystats备份表中、名为set1的对象统计信息进行比较:
dbms_stats.diff_table_stats_in_stattab(
ownname => user,
tabname => 'T',
stattab1 => 'MYSTATS',
statid1 => 'SET1',
stattab1own => user,
pctthreshold => 10);
Ø diff_table_stats_in_history比较一张表的当前对象统计信息与历史记录中的对象统计信息,或者比较这张表历史记录中的两组对象统计信息。参数time1和time2用来指定使用哪些对象统计信息比较。如果time2没有指定,或者设置为NULL,则当前对象统计信息与历史记录中的另一组进行比较。下面的例子将当前对象统计信息与一天之前的对象统计信息(例如,在夜间执行的统计信息收集之前的对象统计信息)进行比较:
dbms_stats.diff_table_stats_in_history(
ownname => user,
tabname => 'T',
time1 => systimestamp -
1,
time2 => NULL,
pctthreshold => 10);
Ø diff_table_stats_in_pending将一张表的当前对象统计信息或者历史记录中的一组信息,与挂起的统计信息进行比较。要想指定存储在历史记录中的对象统计信息,可以使用参数time_stamp。如果这个参数设置为NULL(默认值),则当前对象统计信息与挂起的统计信息进行比较。下面的例子将当前的统计信息与挂起的统计信息进行比较:
dbms_stats.diff_table_stats_in_pending(
ownname => user,
tabname => 'T',
time_stamp => NULL,
pctthreshold => 10);