自动收集统计信息

Db2® 优化器使用目录统计信息来确定查询的最高效存取方案。 通过使用自动收集统计信息功能(这是 DB2 的自动表维护功能的一部分),可让数据库管理器确定是否必须更新统计信息。

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

可采用以下两种方式执行自动收集统计信息功能:
  • 对于在语句编译时进行的同步收集,可使用实时统计信息 (RTS) 功能。 auto_stmt_stats 数据库配置参数用于 RTS 统计信息收集和 RUNSTATS 活动日志记录。
  • 对于异步收集,可启用 RUNSTATS 命令以在后台运行。 auto_runstats 数据库配置参数用于在后台自动收集统计信息。
缺省情况下,当创建数据库时,会同时启用这两个参数。 尽管可在实时收集统计信息功能处于禁用状态时启用后台收集统计信息功能,但当执行实时收集统计信息功能时,还是会始终启用后台收集统计信息功能。

可使用配置顾问程序来确定数据库的初始配置,其中包括各个数据库配置参数的相应设置。

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

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

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

可启用实时收集统计信息功能,以便可通过使用某些元数据来生成统计信息。 生成表示派生或创建统计信息,而不是作为正常 RUNSTATS 命令活动的一部分来收集统计信息。 例如,表中的行数可通过表中的页数、页面大小和平均行宽衍生出来。 在某些情况下,统计信息并非由索引和数据管理器派生但由它们维护,并且可存储在目录中。 例如,索引管理器将在每个索引中维护叶子页数和层数。

与异步收集统计信息功能相比,实时收集统计信息功能会提供更及时、更准确的统计信息。 准确的统计信息可以产生更好的查询执行方案并提高性能。 不管是否启用实时收集收集统计信息功能,异步统计信息收集操作都会每隔两小时执行一次。 此时间间隔可能太长从而不足以为某些应用程序提供准确的统计信息。 在下列情况下,实时或同步收集统计信息功能还将引起发出异步收集请求:
  • 由于表很大而将同步统计信息收集操作用于采样。
  • 已生成同步统计信息。
  • 同步统计信息收集操作由于超出收集时间而失败。
此外,表活动频率对于需要进行异步收集的情况可能足够高,但对于需要进行同步统计信息收集的情况可能不够高。

最多可同时处理两个异步请求,并且仅针对不同表进行处理。 一个请求必须是由实时统计信息收集操作发起,而另一个请求必须是由异步统计信息收集操作发起。

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

尽管实时收集统计信息功能旨在最大程度地减少用于收集统计信息的内存使用量,但是请先在测试环境中尝试使用此功能,以确保不会对性能产生任何负面影响。 在某些联机事务处理 (OLTP) 方案中可能存在负面性能影响,在对查询运行时间设置了限制的情况下尤其如此。

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

对于下列对象,不会执行自动收集统计信息(同步或异步)操作:
  • 已标记为 VOLATILE 的表(在 SYSCAT.TABLES 目录视图中设置了 VOLATILE 字段的表)。
  • 已通过对 SYSSTAT 目录视图发出 UPDATE 语句来手动为其更新了统计信息的表,其中包括为表中任何基于表达式的索引手动更新基于表达式的键列统计信息,即使这些统计信息位于单独的统计视图中。

    手动修改表统计信息时,数据库管理器假定您现在负责维护这些统计信息。 为了让数据库管理器维护具有已手动更新的统计信息的表的统计信息,请通过使用 RUNSTATS 命令来收集统计信息,或者在使用 LOAD 命令时指定收集统计信息。 在 V9.5 之前创建的表以及在升级之前已手动为其更新统计信息的表不受此限制影响。 其统计信息由数据库管理器自动维护,直到您手动对其进行更新。

对于下列对象,不会生成统计信息:
  • 统计视图
  • 通过针对 SYSSTAT 目录视图发出 UPDATE 语句来手动更新其统计信息的表。 如果未启用实时统计信息收集,那么对于您手动更新其统计信息的表,仍会发生某些统计信息生成。

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

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

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

已通过使用 TRUNCATE 语句或通过使用 IMPORT 命令截断的表会由于包含过时统计信息而自动重组。

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

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

如果表具有基于表达式的索引,那么会收集基于表达式的键列的统计信息并作为该表的统计信息收集的一部分进行高速缓存。 对于基于表达式的键列,不会生成统计信息

实时统计信息和说明处理

对于仅由 EXPLAIN 工具解释 (未执行) 的查询,不存在实时处理。 下表概述了 CURRENT EXPLAIN MODE 专用寄存器具有不同值时的行为。

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

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

可使用已高速缓存的统计信息来使同步收集的统计信息可用于所有查询。 此高速缓存是目录高速缓存的一部分。 在分区数据库环境中,统计信息高速缓存仅位于目录数据库分区上,即使每个数据库分区都具有目录高速缓存也是如此。 如果启用实时统计信息收集,那么目录高速缓存需求更高。 如果启用了实时统计信息收集,请考虑调整 catalogcache_sz 数据库配置参数的值。

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

可通过为特定表创建自己的统计信息概要文件来定制所收集统计信息的类型。 有关详细信息,请参阅“使用统计信息概要文件来收集统计信息”。

RTS 收集和后台自动收集统计信息是根据表的有效统计概要文件进行的,但下列情况例外:
  • 为了最大程度地减少同步统计信息收集操作的内存使用量,数据库管理器可通过使用采样来收集统计信息。 在此情况下,采样率和采样方法可能与统计概要文件中指定的采样率和采样方法不同。
  • RTS 收集可能生成统计信息,但是它可能无法生成统计概要文件中指定的所有类型的统计信息。 例如,无法生成 COLCARD、HIGH2KEY 和 LOW2KEY 之类的列统计信息,除非该列在某些索引中是主列。

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

下列各节说明自动收集统计信息的各种操作特征。