DB2 V9.7 for Linux, UNIX, and Windows

自动收集统计信息

DB2® 优化器使用目录统计信息来确定查询的最佳存取方案。过期或者不完整的表或索引统计信息可能会导致优化器选择并非最佳的方案,从而导致查询执行速度下降。但是,决定要为给定的工作负载收集哪些统计信息是很复杂的事情,使这些统计信息保持最新也是一项很花费时间的任务。

通过使用自动收集统计信息功能(这是 DB2 的自动表维护功能的组成部分),可以让数据库管理器确定是否需要更新统计信息。可以使用实时统计信息(RTS)功能在编译语句时以同步方式执行自动收集统计信息操作,也可以启用 RUNSTATS 实用程序以便在后台运行此程序以执行同步收集。虽然可以在实时收集统计信息功能处于禁用状态时启用后台收集统计信息功能,但必须启用后台收集统计信息功能才能执行实时收集统计信息功能。缺省情况下,当您创建新的数据库时,就会启用后台自动收集统计信息功能 auto_runstats 和实时自动收集统计信息功能 auto_stmt_stats

为配置自动统计信息收集,您可以使用 IBM® Data Studio V3.1 或更高版本中提供的任务助手。任务助手可以指导您执行以下过程:设置选项、查看自动生成的命令以执行任务以及运行这些命令。有关更多详细信息,请参阅使用任务助手管理数据库

了解异步收集和实时收集统计信息

启用实时收集统计信息功能之后,还可以使用一些元数据来生成统计信息。生成表示派生或创建统计信息,而不是作为正常 RUNSTATS 活动的一部分来收集统计信息。例如,如果知道一个表中的行数、页大小和平均行宽,那么可以知道该表中包含的行数。在某些情况下,并未真正派生统计信息,而是由索引和数据管理器维护统计信息,并且可以直接将这些统计信息存储在目录中。例如,索引管理器将在每个索引中维护叶子页数和层数。

查询优化器根据查询需求和表更新活动数量(更新、插入或删除操作的数目)来确定统计信息的收集方式。

实时收集统计信息功能能够提供更及时更准确的统计信息。准确的统计信息可以产生更好的查询执行方案并提高性能。未启用实时收集统计信息功能时,将每隔两小时执行一次异步收集统计信息操作。要为某些应用程序提供准确的统计信息,此收集频率可能不够高。

在启用实时收集统计信息功能之后,仍将每隔两个小时执行一次异步收集统计信息检查操作。在下列情况下,实时收集统计信息功能还将引起发出异步收集请求:
  • 表活动频率对于同步收集而言不够高,但对于异步收集而言却又过高
  • 由于表太大,因此同步统计信息收集操作进行了采样
  • 已生成同步统计信息
  • 同步统计信息收集操作由于超出收集时间而失败

最多可以同时处理两个异步请求,但必须针对不同的表处理这些请求。一个请求必须由实时收集统计信息功能发起,而另一个请求必须由异步收集统计信息检查操作发起。

通过使用下面几种方法,可以将自动收集统计信息功能对性能的影响降到最低:
  • 通过使用已调速的 RUNSTATS 实用程序执行异步收集统计信息操作。调速功能根据当前数据库活动来控制 RUNSTATS 实用程序耗用的资源量:随着数据库活动的增加,此实用程序的运行速度将变慢,从而减少资源需求。
  • 对于每个查询,同步收集统计信息操作的时间限制为 5 秒。此值可由 RTS 优化准则控制。如果同步收集操作超出时间限制,那么将提交异步收集请求。
  • 同步统计信息收集操作不会将统计信息存储在系统目录中。而是,此操作将统计信息存储在统计信息高速缓存中,以后再通过异步操作存储在系统目录中。这样就可以避免更新系统目录时产生的开销和可能的锁定争用。后续 SQL 编译请求可以使用统计信息高速缓存中的统计信息。
  • 对于每个表,只能执行一个同步收集统计信息操作。其他需要执行同步收集统计信息操作的代理程序将在可能的情况下生成统计信息,并继续编译语句。在分区数据库环境中也会强制执行此行为,此环境中的不同数据库分区中的代理程序可能需要同步统计信息。
  • 要定制所收集的统计信息的类型,您可以启用统计信息概要分析功能(此功能使用有关先前数据库活动的信息来确定数据库工作负载需要的统计信息),也可以为特定的表创建自己的统计信息概要文件。
  • 只对缺少统计信息或具有高级别活动(根据更新、插入或删除操作的数目衡量)的表收集统计信息。即使表符合统计信息收集条件,也不会收集同步统计信息,除非查询优化需要这些信息。在某些情况下,查询优化器可以在不使用统计信息的情况下选择存取方案。
  • 对于异步收集统计信息检查操作而言,还将对大型表(超过 4000 页的表)进行采样,以确定高级表活动是否更改了统计信息。只有在保证已更改统计信息的情况下,才会收集这种大型表的统计信息。
  • 对于异步收集统计信息操作而言,自动将 RUNSTATS 实用程序安排在维护策略中指定的联机维护时间段运行。此策略还指定自动收集统计信息作用域内的一组表,这进一步减少了不必要的资源消耗。
  • 同步收集和生成统计信息操作不会按照维护策略指定的联机维护时间段进行,这是因为同步请求必须立即执行并且收集时间有限。同步收集和生成统计信息操作遵循特定策略,该策略指定了自动收集统计信息作用域内的一组表。
  • 执行自动统计信息收集操作时,受影响的表仍然可用于常规的数据库活动(更新、插入或删除操作)。
  • 不收集昵称的实时统计信息(同步统计信息或生成的统计信息)。要为异步统计信息收集操作自动刷新系统目录中的昵称统计信息,请调用 SYSPROC.NNSTAT 过程。

尽管实时收集统计信息功能旨在使收集统计信息的开销降至最低,但是请先在测试环境中尝试使用此功能,以确保不会对性能产生负面影响。对某些联机事务处理 (OLTP) 方案使用此功能可能会对性能产生负面影响,对查询运行时间设置了上限的情况下尤其如此。

对常规表、具体化查询表 (MQT) 和全局临时表执行实时同步统计信息收集操作。不会针对全局临时表收集异步统计信息。无法通过自动维护策略工具从实时统计信息中排除全局临时表。

不会对下列对象执行自动收集统计信息(同步或异步)操作:
  • 统计视图
  • 已被标记为 VOLATILE 的表(在 SYSCAT.TABLES 目录视图中设置了 VOLATILE 字段的表)
  • 您已通过直接对 SYSSTAT 目录视图发出 UPDATE 语句手动更新其统计信息的表

    以手动方式修改表统计信息时,数据库管理器假定您现在负责维护其统计信息。为了让数据库管理器维护已经以手动方式更新其统计信息的表的统计信息,请使用 RUNSTATS 命令来收集统计信息,或者在使用 LOAD 命令时指定收集统计信息。在 V9.5 之前创建并且在升级前已手动更新其统计信息的表不受影响,其统计信息将由数据库管理器自动维护,直到您以手动方式更新这些统计信息为止。

不会对下列对象生成统计信息:
  • 统计视图
  • 您已通过直接对 SYSSTAT 目录视图发出 UPDATE 语句手动更新其统计信息的表。注意,即使未启用实时收集统计信息功能,也仍然会对已手动更新其统计信息的表生成某些统计信息。

在分区数据库环境中,将在单个数据库分区中收集统计信息然后进行推测。数据库管理器始终在数据库分区组的第一个数据库分区中收集统计信息(同步和异步)。

至少在数据库激活 5 分钟之后才会执行非实时统计信息收集活动。

将对静态和动态 SQL 执行实时统计信息处理。

已使用 IMPORT 命令截断的表将自动重组为具有旧统计信息。

对于已收集其统计信息的表,同步和异步自动收集统计信息操作将使引用了这些表并已进行高速缓存的动态语句失效。这样做是为了能够使用最新统计信息来重新优化已进行高速缓存的动态语句。

在取消激活数据库的情况下,“以异步方式自动收集统计信息”操作可能会中断。如果未使用 ACTIVATE DATABASE 命令或 API 显式激活此数据库,那么在最后一个用户与此数据库断开连接时,就会取消激活此数据库。如果操作中断,那么可能会将错误消息记录在 DB2 诊断日志文件中。为了避免中断“以异步方式自动收集统计信息”操作,请显式激活此数据库。

实时统计信息和说明处理

不会对仅仅使用说明工具进行说明(而未执行)的查询进行实时处理。下表概述了 CURRENT EXPLAIN MODE 专用寄存器具有不同值时的行为。

表 1. 作为 CURRENT EXPLAIN MODE 专用寄存器值的应变量的实时收集统计信息操作
CURRENT EXPLAIN MODE 值 是否考虑实时收集统计信息
YES
EXPLAIN
NO
REOPT
RECOMMEND INDEXES
EVALUATE INDEXES

自动统计信息收集和统计信息高速缓存

DB2 V9.5 引入了统计信息高速缓存,以便使以同步方式收集的统计信息可用于所有查询。此高速缓存是目录高速缓存的一部分。在分区数据库环境中,统计信息高速缓存仅存在于目录数据库分区中,即使每个数据库分区都有目录高速缓存也是如此。启用实时收集统计信息功能之后,目录高速缓存需求更高。如果启用了实时收集统计信息功能,那么应考虑调整 catalogcache_sz 数据库配置参数的值。

自动统计信息收集和统计概要文件

同步和异步统计信息是根据表的有效统计概要文件收集的,但下列情况例外:
  • 为了使同步收集统计信息操作的开销降至最低,数据库管理器可以通过进行采样来收集统计信息。在这种情况下,采样率和方法可能与统计概要文件中指定的采样率和方法不同。
  • 同步统计信息收集操作可以选择生成统计信息,但是可能无法生成统计概要文件中指定的所有统计信息。例如,无法生成 COLCARD、HIGH2KEY 和 LOW2KEY 之类的列统计信息,除非该列在某些索引中是前导列。

如果同步统计信息收集操作无法收集统计概要文件中指定的所有统计信息,那么将提交异步收集请求。

下列各节说明了自动收集统计信息的不同运行特征。