自动收集统计信息

当统计信息管理器准备其对优化器的响应时,它将跟踪使用缺省过滤因子生成的响应。 当列统计信息或索引不可用时,将使用缺省过滤器因子。 统计信息管理器使用此信息为列自动生成统计信息收集请求。 将存取方案写入计划高速缓存时,会发生此请求。 如果系统资源允许,那么将实时进行统计信息收集,以供当前查询直接使用,从而避免使用优化器的缺省答案。

否则,当系统资源变为可用时,将在后台收集所请求的列统计信息。 下次执行查询时,缺少的列统计信息可供统计信息管理器使用。 此过程允许统计信息管理器在此时向优化器提供更准确的信息。 更多的统计信息使优化器更容易生成更好的执行存取方案。

如果在执行之前或期间取消了查询,那么仍将处理对列统计信息的请求。 如果执行到达将生成的存取方案写入计划高速缓存的点,那么会发生这些请求。

为了最大限度减少统计信息收集期间通过表的次数,统计信息管理器会对同一表的多个请求进行分组。 例如,将对表 T1执行两个查询。 第一个查询在列 C1 上具有选择标准,第二个查询在列 C2上具有选择标准。 如果没有可用于该表的统计信息,那么统计信息管理器会将这两列都标识为列统计信息的良好候选者。 当统计信息管理器复审请求时,它会查找同一表的多个请求,并将这些请求分组到一个请求中。 此分组允许仅使用一个通过表 T1的传递来创建两个列统计信息。

需要注意的一点是,当统计信息管理器必须使用缺省过滤器因子回答来自优化器的问题时,通常会自动创建列统计信息。 但是,如果有可用于生成答案的索引,那么不会自动生成列统计信息。 在此场景中,可能存在优化时间受益于列统计信息的情况。 使用列统计信息来回答来自优化器的问题比使用索引数据更有效。 因此,如果查询性能似乎已扩展,那么您可能希望验证查询中是否存在相关列的索引。 如果是这样,请尝试手动生成这些列的列统计信息。

如前所述,统计信息收集是在系统资源变为可用时进行的。 如果系统上永久处于活动状态的低优先级作业应该使用所有备用 CPU 周期进行处理,那么统计信息收集永远不会处于活动状态。