Informix 11.70 系统管理认证考试 919 准备教程,第 4 部分: 性能调优

调节 IBM Informix® 数据库服务器和它的不同子系统,以实现最优的性能。在概述数据库服务器之后,本文通过一些示例介绍如何查看该服务器及其子系统。本教程将了解重要的数据库优化元素,包括检查点、恢复、物理日志、逻辑日志、异步 I/O VP、网络参数、磁盘资源、CPU VP 资源、PDQ、Memory Grant Manager、扫描线程、索引创建、统计信息维护和自助调节。您可以使用此教程(这个 8 部分教程系列中的第 4 部分)帮助为参加 Informix 11.70 考试 919 第 4 部分做好准备。

Jay B Peterson, 资深软件工程师, IBM China

Jay Peterson 的照片Jay Peterson 是一位前线技术支持分析师。他自 1998 年开始就在 Informix 支持部门工作,专门解决性能相关问题。Jay 是许多与 Informix 产品有关的技术文章的作者。



Frank Arias, 高级支持工程师, IBM China

Frank Arias 的照片Frank Arias 在 IBM 的 Informix Down System Diagnostics 部门中担任高级支持工程师。



2012 年 8 月 09 日

开始之前

免费下载:IBM® Informix® 11.7 试用版(包括 Ultimate Edition、Developer Edition 和 Innovator-C Edition)
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

了解能从本教程获得哪些知识,以及如何最充分地利用它们。

关于本系列

正在考虑获得 Informix 11.70 版的系统管理认证(考试 919)?如果是,那么您来对地方了。这个 认证准备教程系列 涵盖了您在参加考试前需要理解的所有主题。即使您目前没有获取认证的想法,这一系列教程仍然是您开始了解 Informix 11.70 中的新功能的不错地方。

关于本教程

本教程将介绍和描述 Informix 11.70 中的子系统,重点介绍最新的更改。在本教程中,您将学习以下内容以优化您的 Informix 服务器。

  • 检查点
  • 恢复
  • 物理日志
  • 逻辑日志
  • 异步 IO VP
  • 网络参数
  • 磁盘资源
  • CPU VP 资源
  • PDQ 和 Memory Grant Manager
  • 扫描线程
  • 索引创建
  • 统计信息维护
  • 服务器自助调节

本教程是一个由 8 篇教程组成的系列文章的第 4 篇,这个系列可以帮助您准备 Informix V11.70 系统管理认证(919 考试)。本教程中的内容主要涉及该考试的第四部分(性能调优)的目标。

如果您尚未下载和安装一个 IBM Informix 11.70 副本,请考虑这样做。安装 Informix 会帮助您理解 IBM Informix V11.70 系统管理认证考试中会考到的许多概念。

目标

完成本教程后,您应该能够:

  • 了解操作系统资源的注意因素
  • 使用 Informix 功能优化性能

先决条件

要理解本教程中介绍的内容,您必须熟悉以下内容:

  • Informix 环境(配置文件和参数、安装和管理)
  • 数据库服务器命令(onstat、onmode、oncheck 和 dbschema)
  • Informix 概念和术语(dbspace、数据块、物理日志、逻辑日志和检查点)

完成以下步骤,为学习本教程做准备:

  1. 下载并安装一个 IBM Informix 11.70 副本。
  2. 创建一个服务器实例。
  3. 使用命令 %dbaccessdemo7 -log -nots 创建 stores_demo 数据库。

您应该能够使用您的实例和 stores_demo 数据库作为测试本教程中介绍的概念的起点。


调优 Informix 上的性能

性能调优概述

性能调优是一个复杂的过程。要进行性能调优,则需要认识到那些看起来毫不相干但却有可能相互影响的事物。当进行性能调优时,务必将所做的更改和样本运行的性能记录到文档上,以便在发现所做的更改对性能有不良影响之后可以进行复原。

如何开始

性能调优的一个重大问题是子系统太多了,很难知道哪些东西需要调优。先前的经验和实验有助于形成一种直觉,知道哪里运行正常,哪里还需要稍微进行一下调整。随便试试吧,看您是否能利用这些技巧提高服务器的性能。


使用操作系统资源影响系统运行

数据库服务器应用程序的性能取决于以下重要因素:

  • 硬件资源
  • 操作系统配置
  • 网络配置和流量
  • 内存管理

当试图发现性能问题或者对系统作出调整时,必须考虑到这些因素。

硬件资源

硬件组件包含以下部分。

  • CPU
  • 磁盘 I/O 子系统
  • 物理内存

操作系统配置

数据库服务器依赖于操作系统,用它们提供对设备的低级访问、进程调度、进程间通信和其他重要服务。

操作系统的配置对数据库服务器的性能有直接的影响。操作系统内核使用将占用大量物理内存,这部分内存是数据库服务器或其他应用程序不能使用的。此外,还必须预留适当的内核资源供数据库服务器使用。

除了调优内核外,对于栈大小、文件描述符数量等不同资源也有软限制。这些资源可以通过 ulimit 命令进行检查和调整。本教程不打算讨论 ulimit 命令。

temp 目录是许多常见应用程序(比如 vd、ed 或内核)的一个常见存储库。根据用户和在操作系统上运行的应用程序的需求,temp 可能需要相应地进行调整。

磁盘和控制器 I/O 瓶颈

数据库服务器可能需要在位于同一个磁盘上的多个对象(比如一个表和一个逻辑日志文件)上执行 I/O 操作。具有高 I/O 需求的繁忙进程之间的争用可能会减缓它们的运行速度。监视磁盘使用情况很重要。在这种情况下,可以通过负载均衡(将表转移到另一个磁盘)来提高性能。

网络配置和流量

依赖于网络与数据库服务器通信的应用程序,以及依赖于数据复制来维护高可用性的系统,其性能都要受到网络的约束。在网络上传输数据通常比从磁盘传输数据慢。网络延时对数据库服务器和其他在主计算机上运行的应用程序的性能有很大的影响。

内存管理

操作系统需要在内存中提供一个页面,以便在这个页面上执行相应的操作。如果操作系统需要分配供某个进程使用的内存,它首先会尝试提取它发现的内存中未被使用的页面。但是,如果没有空白页面,内存管理系统必须选择其他进程正在使用的页面。相关引擎会尽量识别出那些看上去短时间内最不可能需要的页面,然后用新的页面置换它们。寻找这些可以被置换的页面的过程就叫做页面扫描。页面扫描会增加对 CPU 的利用。

大多数内存管理系统会使用最近最少使用算法来确定可以置换内存中的哪些页面。识别出这些页面之后,首先会将它们复制到磁盘上。然后将内存释放出来,供其他进程使用。在将某个页面写入磁盘时,会将它写入一个称作交换空间交换区域 的特定区域,可从这里将页面读回内存中。这个空间通常是一个专用磁盘或磁盘分区。这个过程称作分页 (paging)。分页过程需要利用 I/O 资源和 CPU 周期。

在某个时候,必须将换出的页面映像换回到内存中,以便需要它们的进程可以使用它们。所以对于其他较旧的页面(最近没有被使用的页面),这个周期又开始了。如果非常频繁地这样来回交换,操作系统可能达到这样一种状态:内核几乎完全被用于页面的复制进和复制出。这种状态称作系统失效 (thrashing)。如果系统失效,所有有用的工作都被终止。

为了防止系统失效,有些操作系统的内存管理算法会大致地确定一个阈值。这样做不是为了寻找较旧的页面,而是为了换出用于某个特定进程的所有页面(以交换磁盘上的空间)。这个过程称作交换 (swapping)。

每个被换出的进程最终必须换回到内存中。交换设备的磁盘 I/O 大大增加了进程间切换所需的时间,因为现在每次上下文切换还必须读(入内存)与进程相关的所有页面进内存。因此,性能受到将那些页面从交换磁盘传输到内存的速度的限制。正在进行交换的系统会严重超载,其吞吐量会降低。

很多操作系统都拥有提供有关分页和交换活动的信息的命令。报告的重要统计信息包括:

  • 分页或换出内存的页面数量
  • 页面扫描数量(这是内存利用率正在成为瓶颈的一个早期指示符)
  • 分页或换进内存的页面数量(这个数量常常无法像换出页面那样可靠地指示问题,因为换进包括在活动进程终止或内存被释放时对进程的初始加载和换出的页面的加载)

配置服务器

这一节主要介绍最新的服务器配置增强,它们对性能具有影响,但在以后的更多主题中,不会再对它们进行介绍。

VPCLASS

因为 Informix 是可伸缩的,所以可对它进行调优以容纳大型实例。用于调优虚拟处理器 VP 的主要参数是 VPCLASS 参数。

下面的参数已经被弃用,并被 VPCLASS 参数替代:

  • NUMCPUVPS
  • SINGLE_CPU_VP
  • AFF_SPROC
  • AFF_NPROCS
  • NOAGE
  • NUMAIOVPS

VPCLASS 语法

清单 1 给出了 VPCLASS 参数的语法。

清单 1. VPCLASS 语法
VPCLASS classname,options

VPCLASS 参数中的 classname 提供了您配置的虚拟处理器类型的名称。该名称是不区分大小写的。

可以为用户定义的例程 DataBlade® 模块定义新的虚拟处理器类型,或者为预定义的虚拟处理器类型设置一个值。表 1 中的类型名称是预定义的:

表 1. 预定义的 VPCLASS 类型名称
admlioshmadt
mscsoccpu ntk
strjvpopttli
kioaiopioencrypt

classname 变量是必需的。与大多数配置参数不同,VPCLASS 有一些选项字段,它们可以按任意顺序出现,之间用逗号隔开。字段中不能使用空格。VPCLASS 有以下可选的次要参数:

  • num=num_VPs
  • max=max_VPs
  • aff=affinity
  • noage
  • noyield

每个虚拟处理器都可以实例化为一个操作系统进程。因此可以使用 VPCLASS 将一种类型的活动指示给一个 oninit 进程。有关更多信息,请参 参考资料

多个 CPU 的配置

如前所述,IDS 是可伸缩的,可以对它进行配置,以便容纳和使用具有多个 CPU 的计算机。可以计算 CPU VP 的数量,如 清单 2 中所示。

清单 2. 3 个 CPU VP 的配置
VPCLASS  cpu,num=3

Java VP

VPCLASS 配置参数的 JVP 选项可以设置 Java 虚拟处理器的数量。当使用 IBM Informix JDBC Driver 时,这个参数是必需的。在 UNIX 上,必须定义多个 Java 虚拟处理器来并行执行 Java 用户定义例程。

网络 VP

对于 VP 类型 tlishmstrsoc,必须将 NETTYPE 配置参数的 VP_class 字段设置为 NET

例如,可以如 清单 3 中所示设置 VPCLASS 参数。

清单 3. 使用 NET 的 VPCLASS 参数
VPCLASS  shm,num=1
VPCLASS  tli,num=1

应该像 清单 4 中这样设置 NETTYPE 参数。

清单 4. 具有 NET 的 NETTYPE 参数
NETTYPE  ipcshm,1,100,NET
NETTYPE  tlitcp,1,100,NET

配置共享内存参数

分配给 Informix 数据库服务器的共享内存取决于一些配置参数,如 表 2 中所示。

表 2. 共享内存参数
参数说明
EXTSHMADD指定增加的扩展段 (extension segment) 的大小
SHMADD指定当数据库服务器请求更多内存时内存的增量
SHMBASE指定共享内存基址,这与计算机有关。该值取决于您使用的是什么平台,处理器是 32 位还是 64 位的。要了解关于使用哪个 SHMBASE 值的信息,请参阅计算机说明
SHMTOTAL指定允许数据库服务器使用的最大内存量
SHMVIRTSIZE指定数据库服务器使用的第一块内存的大小
BUFFERPOOL配置共享内存页面缓存,包括每个(页面大小)池的缓冲区数量、页面大小和 LRU 参数

请认真考虑共享内存配置参数。主要的性能考虑因素是最大页面缓存 (BUFFERPOOL) 和分配足够的虚拟内存 (SHMVIRTSIZE)。如果初始虚拟内存对于长期处理而言不够用,那么动态增加虚拟内存段 (SHMADD) 可能在处理期间创建大量虚拟内存段,这可能会导致性能降低。

DIRECT_IO

DIRECT_IO 参数支持直接 I/O 和并发 I/O,从而可以通过使用熟文件 (cooked file) 定义的数据块来提升性能。使用熟文件的 I/O 一般比原始设备更慢,因为它需要使用额外的 I/O 层和缓冲区在熟文件上进行读写。Informix 无法控制这个操作系统子系统。但是,某些操作系统平台支持直接 I/O,这可绕过针对熟文件块的 I/O 层和缓冲。熟文件的性能可接近用于 dbspace 数据块的原始设备的性能。

直接 I/O 仅可用于常规的 dbspace 数据块,不能将其用于临时 dbspace。文件系统和操作系统必须支持页面大小的直接 I/O。原始设备不支持直接 I/O。内核异步 I/O (KAIO) 对于放在原始设备上的数据块而言是首选 I/O 方法。

并发 I/O(目前受 AIX® 支持)在直接 I/O 基础上增添了并发功能。并发 I/O 允许对一个文件执行多个并发读写操作。性能增强对分布于多个磁盘上的单一数据块的 I/O 最为明显。

要确定 Informix 对某个数据块使用直接 I/O 还是并发 I/O,可以监视 onstat -d 的标志字段的第五位,如 表 3 中所示。

表 3. DIRECT_IO 配置
DIRECT_IO 设置效果onstat -d 标志
0关闭直接 I/O-
1开启直接 I/OD
2开启直接和并发 I/OC

在一些启用了直接 I/O 的操作系统上,具体实现使用了 KAIO。如果启用了直接 I/O,那么数据库服务器会尝试使用 KAIO 完成该工作。如果启用了 KAIO,那么 AIO 虚拟处理器的数量可以有所减少。前提是 KAIO 已开启(未在环境中设置 KAIOOFF)。

Windows 支持使用 ONCONFIG 参数。在 Windows 平台上,默认情况下会打开 DIRECT_IO 作为直接 I/O。

SQLTRACE

可以通过多种方式配置 SQLTRACE 配置参数,以收集各个查询的性能数据。还可以使用 SQLTRACE 定义跟踪的范围。配置文件中的默认设置如 清单 5 中所示。

清单 5. 默认设置
SQLTRACE level=low,ntraces=1000,size=2,mode=global

跟踪数据存储在 sysmaster 表中,可通过 onstat -g his 命令显示。例如,可以查看查询计划成本估算值、返回的行数和配置文件数据。也可以从 sysadmin 数据库使用 task()admin() 函数来启用和禁用 sqltracing。

SQL 跟踪对分析运行了许多查询的应用程序中执行的各个查询特别有用。

BATCHEDREAD_TABLE

Informix 有时在大数据库表中执行轻量扫描 (light scan),一次读取许多数据页面并绕过缓冲池。可通过在配置文件中启用 BATCHEDREAD_TABLE,为压缩的表、具有比一个页面更大的行的表以及拥有任何数据(包括 VARCHAR、LVARCHAR 和 NVARCHAR 类型)的表执行轻量扫描。此参数已自动启用。

轻量扫描会绕过缓冲池,为一些查询带来性能改进。您可以使用 onstat -g scn 命令监视轻量查询活动。

BATCHEDREAD_INDEX

通过配置 BATCHEDREAD_INDEX,可以告诉服务器在合适的时候从一个索引缓冲区获取一组键,进而减少缓冲区读取。


优化通信性能

调优一个指定的服务器连接

作为数据库管理员,您一定希望调节网络参数来优化各种服务器连接的通信性能。可以连接到服务器或别名,它们需要单独进行调节。DBSERVERNAMEDBSERVERALIASES 服务器配置参数分别对应于 sqlhosts 文件中的一行。用于该行的协议(第二个字段)通过使用匹配协议将该连接映射到一个 NETTYPE 条目。可通过配置 NETTYPE 条目进行相应的调节。NETTYPE 定义如 清单 6 中所示。

清单 6. NETTYPE 定义
NETTYPE protocol,poll_threads,conn_per_thread,VP_class

NETTYPE 配置指定了一种虚拟处理器类型 (VP_class),轮询线程将在该类型上运行。轮询线程处理传入的连接请求并将这些请求传递到监听线程,后者接受客户端连接并启动一个 sqlexec 线程。轮询线程可在 CPU 虚拟处理器 (VP) 内部运行,也可在 NET(网络)VP 上运行。一般情况下,在单 CPU 机器的 CPU VP 上运行轮询线程更有效。但是,在具有大量远程客户端的多处理器计算机上,在一个 NET VP 上运行它们可获得更好的吞吐量。

可以针对您希望数据库服务器处理的连接负载大小来调节 poll_threadsconn_per_thread。对于较小的系统,一个轮询线程通常就足够用了。对于可能拥有 200 或更多并发网络用户的系统,可通过添加更多轮询线程来获得更高的性能。对于较高的用户负载,您可能需要尝试确定最优的轮询线程配置(在内部运行还是在 NET VP 上运行)。

请注意,可为每个轮询线程创建一个网络虚拟处理器。清单 7 中的 NETTYPE 在 3 个 soc 虚拟处理器上为总共 600 个用户连接配置了 3 个轮询线程。

清单 7. Example NET VP 定义
NETTYPE soctcp,3,200,NET

数据库服务器可根据需要添加资源,从而处理更多的网络连接。清单 7 没有将套接字连接数量限制到 600。但是,对于共享内存连接,该配置数量是一个硬性限制。

如果未配置 NETTYPE,默认情况下,会为用于网络虚拟处理器上的 DBSERVERNAME 服务器内联 (CPU VP) 和 DBSERVERALIASES 的协议运行轮询线程,这些虚拟处理器是为指定协议类型而生成的。因为一个轮询线程在一个虚拟处理器上运行,如果配置的轮询线程比 CPU 虚拟处理器多,那么 Informix 会生成更多网络虚拟处理器。

如果您想要大量连接,并且您的操作系统支持快速轮询,那么您可以启用 FASTPOLL 来快速轮询您的网络并实现最优的连接性能,如 清单 8 中所示。

清单 8. FASTPOLL 命令
FASTPOLL  1

分配其他监听线程

监听线程对用户进行验证,建立与数据库服务器的连接,并启动 sqlexec 线程。如果感觉对服务器对连接请求的处理不满意,可以添加监听线程。监听线程专用于它运行时使用的端口。您需要使用其他 DBSERVERALIASES 参数为每个额外的端口指定一个 dbservername,在 sqlhosts 文件中相应地指定一行,其中包含正确的协议和惟一的端口。

添加另一个网络接口卡

有时主机计算机的某个网络接口卡可能无法处理您想要的连接吞吐量。或者可能需要将数据库服务器连接到多个网络。在这些情形下,可以添加一个网络接口卡。

要支持多个网络接口卡,必须为每个卡分配惟一的主机名或网络地址。添加一个网络卡后,还需要添加一个额外的监听线程在该卡上运行。数据库服务器将使用 sqlhosts 文件中的主机名条目来确定使用哪个卡。

网络缓冲区

数据库服务器会尝试优化连接内存的使用。客户端请求会促使从全局内存池分配网络内存缓冲区,当释放缓冲区时,它们会保留在一个池中。这可以阻止不必要的重新分配。这个空闲的缓冲池可用于多个协议,包括 SOCTCP、IPCSTR 和 TLITCP。有一种机制可用于将缓冲区从空闲池返回到全局内存池,在使用量减少时避免不必要的内存分配。服务器计算一个空闲缓冲区阈值,当超过该数字时,缓冲区就会返回到全局池。

数据库服务器使用 清单 9 中的公式计算网络缓冲池中的空闲缓冲区阈值。

清单 9. 空闲缓冲区阈值公式
free network buffers threshold = 100 + (0.7 * number_connections)

number_connections 值应该是 NETTYPE 参数的第三个字段。

数据库服务器对计算的使用空闲缓冲池的各种协议数量求和。将这个和与池中的缓冲区数量对比。如果空闲池中的缓冲区数量比求和的阈值更大,则将缓冲区返回到全局池。

调整网络缓冲区的大小以容纳一个典型的请求,这可改进 CPU 利用率,消除将一个请求分解为多个消息的需求。但是,在继续处理时要格外小心,因为数据库服务器会动态地为所有活动连接分配具有指定大小的网络缓冲区。如果配置了太大的缓冲区大小,则可能使用大量的内存。

数据库管理员可使用以下一种方法控制每个缓冲区的大小,我们将详细介绍这些方法。

  • sqlhosts 文件或注册表中的 IFX_NETBUF_SIZE 环境变量和 b(客户端缓冲区大小)选项
  • IFX_NETBUF_PVTPOOL_SIZE 环境变量 variable

IFX_NETBUF_SIZE 环境变量

IFX_NETBUF_SIZE 环境变量指定公共网络缓冲池和私有网络缓冲池中的每个网络缓冲区的大小。默认缓冲区大小为 4KB。

使用 IFX_NETBUF_SIZE 配置较大的缓冲区大小可以减少接收每个数据包所需的开销。如果您知道客户端会发送大于 4KB 的数据包,那么可以配置 IFX_NETBUF_SIZE 来平均分配数据包大小。客户端可在任何以下情形下发送大数据包:

  • 表加载
  • 行大小大于 4KB
  • 发送简单大对象

sqlhosts 的 b 选项对应于 IFX_NETBUF_SIZE 参数。sqlhosts 选项的值通常应该与 IFX_NETBUF_SIZE 的值匹配。

IFX_NETBUF_PVTPOOL_SIZE 环境变量

数据库服务器为每个使用 SOCTCP、IPCSTR 或 TLITCP 网络连接的会话提供了一个私有网络缓冲池。这些池中的缓冲区是从前面提及的池(全局池和空闲池)中进行分配的。

在许多连接和会话都一直保持活动状态的环境中,私有网络缓冲区提供了以下优势:

  • 对公共网络缓冲池的争用更少
  • CPU 解除了分配网络缓冲区。可以静态地使用这些缓冲区。

每个会话的私有网络池的大小由 IFX_NETBUF_PVTPOOL_SIZE 环境变量指定。默认大小为 1 个缓冲区。

监视和调节网络缓冲区使用的 Onstat 命令

使用 表 4 中的 onstat 选项监视网络缓冲区的使用情况。

表 4. 使用 onstat 监视网络缓冲区
选项输出字段字段说明
onstat -g ntuq-pvt此会话的私有池中的空闲缓冲区的当前数量和最高数量
onstat -g ntmq-exceeds超过空闲缓冲区阈值的次数

onstat -g ntu 选项显示了 q-pvt 输出字段的格式,如 清单 10 中所示。

清单 10. q-pvt 输出字段
current  number  /  highest  number

如果空闲缓冲区的数量(q-pvt 字段中的值)一直为 0,那么可以执行以下操作之一:

  • 使用环境变量 IFX_NETBUF_SIZE 增加每个缓冲区的大小
  • 使用环境变量 IFX_NETBUF_PVTPOOL_SIZE 增加缓冲区数量

q-exceeds 字段表示超过共享网络空闲缓冲池的阈值的次数。当超过此阈值时,数据库服务器会向全局内存池返回(超过此阈值的)未使用的网络缓冲区。最佳情况是,此值应该始终为 0 或一个较小的数字。这是指示符表示服务器没有分配或解除分配网络缓冲区。

可以使用 清单 11 中的 onstat 命令查看网络缓冲区大小。

清单 11. 查看网络缓冲区大小的 onstat 命令
onstat  -g  afr  global  |  grep  net

输出中的 size 字段以字节为单位显示了网络缓冲区大小。


更新统计信息

Informix 服务器使用一个基于成本的优化器。当优化器确定查询计划时,它向每个可能的计划分配一个成本,然后选择具有最低成本的计划。优化器用于确定每个查询计划的成本的一些因素包括:

  • 与每个文件系统访问关联的 I/O 请求数量
  • 确定哪些行满足查询断言所需的 CPU 工作
  • 排序或分组数据所需的资源
  • 可用于查询的内存量(由 DS_TOTAL_MEMORYDS_MAX_QUERIES 参数指定)

为了计算每个可能的查询计划的成本,优化器将执行以下操作:

  • 使用一组描述表数据和索引的性质和物理特征的统计信息
  • 检查查询过滤器
  • 检查可在计划中使用的索引
  • 分析通过转移数据在本地或远程为分布式查询执行连接的成本

UPDATE STATISTICS 语句会更新系统目录中的统计信息。优化器使用这些统计信息来确定成本最低的查询计划。根据所需的统计信息精度和收集数据的时间限制,可能会以各种精确度分配一些类型的统计数据。

要确保优化器选择一个能最佳地反映表的当前状态的查询计划,可在未自动生成动态表(换句话说,数据不断变化的表)的统计信息时定期运行 UPDATE STATISTICS。

表 5 总结了运行不同 UPDATE STATISTICS 语句的时间。如果您有许多表,那么可以编写一段脚本来生成这些 UPDATE STATISTICS 语句。

表 5. 运行 UPDATE STATISTICS 的指南
统计语句目标使用
UPDATE STATISTICS LOW DROP DISTRIBUTIONS索引和丢弃分布
  • 发生重大更改的行数
  • 从以前的数据库服务器版本迁移之后
UPDATE STATISTICS LOW索引
  • 适用于不是任何索引的前导列的所有列
  • (多列索引中的所有列)适用于在连接列或过滤列上定义了多列索引的查询
UPDATE STATISTICS MEDIUM DISTRIBUTIONS ONLY数据分布
  • 拥有未建立索引的连接列或过滤列的查询
UPDATE STATISTICS HIGH数据分布和索引
  • 已建立了连接列或过滤列的索引的查询的一个索引中的表或前导列
  • (多列索引中的第一个区分列)适用于在连接列或过滤列上定义了一个多列索引的查询
  • 拥有许多小表(可放在一个盘区中)的查询

改进的统计信息维护

在早期版本中,更新统计信息是使用 SQL 语句手动执行的。您执行的语句需要完整地执行。Informix 现在拥有阻止服务器在数据未显著更改时执行不必要的分布计算的内置机制。而且,一些更新统计信息语句现在使用 DDL 语句执行。更新统计信息也可是完全自动化的,使用计划程序在后台启动。

管理员通常依据有关既定间隔的指南来运行更新统计信息。数据分布常常在数据未显著更改时重新计算。您现在可以通过配置服务器,仅在更改表数据中的一个阈值后执行标准 UPDATE STATISTICS 语句期间计算分布。您也可以以分段为单位重新计算分布,仅使那些满足阈值更改条件的部分表分段刷新分布。

STATCHANGE 配置参数可以设置触发分布重新计算的过时统计信息的百分比。AUTO_STAT_MODE 配置参数支持在服务器范围使用 STATCHANGE 来控制更新统计信息。清单 12 中的配置启用了 STATCHANGE,并将级别设置为 12%。

清单 12. STATCHANGE 配置
AUTO_STAT_MODE  1
STATCHANGE  12

当启用自动模式时,UPDATE STATISTICS 语句会使用 STATCHANGE 值来识别那些统计信息已丢失或过时的表、索引或分段分布,并且仅更新这些信息。可以使用 onmode 命令动态地更改AUTO_STAT_MODE

可以使用 sql SET ENVIRONMENT 语句在会话级别设置 AUTO_STAT_MODESTATCHANGE。会话设置优先于配置值。要实现更细的控制粒度,可在新统计信息选项子句中设置 CREATE TABLE 或 ALTER TABLE 语句中的 STATCHANGE。这些设置优先于其他所有设置。

通过使用 CREATE TABLE 和 ALTER TABLE 语句的另一个选项,可以在表分段上选择性地更新统计信息。STATLEVEL 属性由以下任何一个选项来完成:

AUTO
启用分段级统计信息并自动确定一个分段是否应该刷新统计信息。此模式可通过表达式、列表或间隔用于分段。一个表必须拥有多于 100 万的行。AUTO 是默认设置。
FRAGMENT
启用分段级统计信息
TABLE:
指定的统计信息是按表进行收集的

UPDATE STATISTICS 语句本身拥有一个 AUTO 或 FORCE 选项。AUTO 选项强制更新统计信息语句使用 STATCHANGE 控制值来决定刷新哪些统计信息。FORCE 选项会告诉更新统计信息使用刷新所有统计信息的经典模式。

更新统计信息现在使用某些 DDL 语句自动运行,包括以下语句:

  • ALTER FRAGMENT ATTACH
  • ALTER FRAGMENT DETACH
  • ALTER TABLE ADD CONSTRAINT
  • ALTER TABLE MODIFY
  • CREATE INDEX

无论是否有 ONLINE 关键字,CREATE INDEX 都会自动生成以下统计信息:

  • 索引级统计信息相当于 LOW 模式下 UPDATE STATISTICS 操作中收集到的统计信息,用于所有类型的索引,包括 B-树、虚拟索引接口和函数索引
  • 列分布索引相当于 MEDIUM 模式下 UPDATE STATISTICS 操作中收集到的分布信息,用于普通 B-树索引的 non-opaque 引导索引列

指定 SAMPLING SIZE

现在可以选择控制用于大型表的 B 树索引上的 UPDATE STATISTICS LOW 的抽样大小。可使用配置文件中的 USTLOW_SAMPLE 设置或 SET ENVIRONMENT 语句启用抽样。默认 statistics low 命令会遍历序列中的每个叶页面。这非常耗时。当将 USTLOW_SAMPLE 设置为 1 时,会抽样获得 100,000 个或更多叶页面的索引。这样做可以极大地节省时间,查询优化器需要处理的数据更少。

与这些参数中的许多参数一样,可以使用 onmode 命令在引擎处于在线状态时更改 USTLOW_SAMPLE

SAMPLING SIZE 关键字和 UPDATE STATISTICS MEDIUM 可以一起使用,用于指定在计算列分布统计信息时抽样的最小行数。抽样的行数将大于以下两个值:

  • 指定的值
  • 满足每个 bin 中的行的百分比,同时满足置信度所需的行数

每个 bin 中的行的默认百分比为 2.5%,最小置信度为 0.80。 例如,清单 13 中的语句计算 customer 表中三个列的统计信息。至少有 300 行被抽样,但是实际抽样可能多于 300 行。不过,如果需要更多的行来满足默认的 0.80 的置信度,那么对于一个使用 60 个同等类别的示例分布,会对更多的行进行抽样。每个 bin 中被抽样的值的平均百分比将为 3%。

清单 13. SAMPLING SIZE 的使用示例
UPDATE STATISTICS MEDIUM FOR TABLE customer (address1, city, state)
SAMPLING  SIZE  300  RESOLUTION  3  DISTRIBUTIONS  ONLY;

在 UPDATE STATISTICS MEDIUM 运行时,Informix 服务器始终在系统目录中记录实际的抽样大小(表示为占表中总行数的百分比)。

使用完全自动化的更新统计信息 (AUS)

更新统计信息现在是完全自动化的。服务器收集有关表使用情况的数据,非常类似于您在 onstat -g ppf(分区配置文件)输出中看到的。服务器会使用这些数据确定数据分布是否需要更新,并会基于这些数据创建特定的更新统计信息命令,依据一个预定义的计划执行它。

自动更新统计信息是使用 sysadmin 数据库中的 3 个任务以及存储过程、触发器和其他支持数据库结构来实现的。以下是在 ph_task 表中的行中定义的任务:

mon_table_profile
按分区或分段收集配置文件数据,将该数据存储在 mon_table_profile 表中。
自动更新统计信息估算
确定哪些表和列数据统计信息需要刷新,将最终的更新统计信息语句存储在 aus_command 表中。
自动更新统计信息刷新
执行 aus_command 表中未完成的更新统计信息命令

用户可以选择修改默认的任务执行计划,直接使用 SQL 或运行 OpenAdmin Tool (OAT) 来更新任务行的字段。

启用和禁用自动更新统计信息

您可能希望继续执行您自己的更新统计信息命令的计划,而不是依赖于自动更新统计信息。以下是一些阻止数据库服务器自动更新统计信息的方法。

禁用 AUS 估算和 AUS 刷新任务
这是禁用自动更新统计信息或任何其他任务的一个推荐方法。它是关闭 AUS 的最具体的方法。更新任务的 ph_task 表的 tk_enable 字段,将该值设置为 f。以后您可以通过将这些值设置为 t 来启用这些任务。此字段可用作任务计划程序的开关。此方法特定于给定的任务。
计划程序任务可在引擎处于在线状态时停止和启动线程
这会运行函数任务(计划程序停止)
阻止创建 sysadmin 表
sysadmin 数据库会在初始化该实例时默认创建,或者通过从以前的 Informix 版本升级来创建。要阻止创建该数据库,可以(以用户 Informix 的身份)在 $INFORMIXDIR/etc/sysadmin 中创建一个名为 stop(停止文件)的文件。如果您在以后某个时刻删除停止文件并执行 oninit 使引擎处于在线状态,则会创建 sysadmin。

IBM Informix 建议阻止创建 sysadmin 数据库。数据库任务可用于除 AUS 以外的许多用途。

阻止创建支持 sysadmin 函数的线程
dbScheduler 和 dbWorker 线程管理 sysadmin 数据库的任务。您可通过创建一个停止文件并回收该实例来阻止创建这些线程。

与阻止创建 sysadmin 数据库一样,这可能对其他基本任务带来负面影响。

调优自动更新统计信息

sysadmin 数据库的 ph_threshold 表包含设置更新统计信息过期策略(确定何时需要刷新统计信息的条件)和用于自动更新统计信息的 PDQ 优先级。这些设置中包括 AUS_CHANGE。这类似于 STATCHANGE,它本身对控制通过计划程序执行的更新统计信息没有任何影响。


使用索引

使用 CREATE 和 DROP INDEX ONLINE 语句

现在可以以非独占的方式创建和删除索引。可以使用 CREATE INDEX ONLINE 和 DROP INDEX ONLINE 语法在联机或者动态环境中创建和删除索引。数据库和它的相关表不会被独占地锁住,这意味着可以更新或读取它们。

在索引创建期间,如果在创建索引时带有 ONLINE 关键字,则不需要在表上放置独占锁。可以在表上进行读取和更新。索引的创建不必等到可以在表上放置独占锁。

如果索引是带 ONLINE 关键字创建的,则数据库服务器用一个特定的标志记录操作。现在,恢复操作将检查那个标志,并且可以重新创建索引。

使用 CREATE INDEX ONLINE 语句创建索引的优点有:

  • 可以立即创建索引,不必在表上放置锁
  • 在创建索引的同时可以对表进行更新
  • 优化器可以更新未被锁的表中的统计信息,从而可以获得更佳的查询计划

可以使用 CREATE INDEX ONLINE 语法创建附属索引,但是 ONLINE 语法只在事务隔离级别为脏读 (dirty read) 时才适用。创建索引时,会在表上放置一个独占锁,并等待所有其他扫描表的、使用索引分区的并发进程结束,然后才创建附属索引。如果这个表正在被读取或更新,那么 CREATE INDEX ONLINE 语句等待释放独占锁。

如果没有将 LOCK MODE 设为 WAIT,则附属索引的创建可能失败,因为它不会等待其他用户完成。请注意,在创建索引之后,当引擎更新系统编目信息时,它会在短时间内放置一个锁。

清单 14 提供了带有 ONLINE 关键字的使用 CREATE INDEX 的语法。

清单 14. 带有 ONLINE 关键字的 CREATE INDEX 示例
CREATE  INDEX  i1  ON  tab1(c1)  ONLINE=3

ONLIDX_MAXMEM

ONLIDX_MAXMEM 配置参数用于限制分配给原像 (preimage) 日志池或更新日志池的内存大小。这些池是用 ONLINE 关键字创建索引时在共享内存中创建的。如果您计划在(使用 ONLINE 语法)创建索引时在表列上完成其他操作,那么这可能很有用。

ONLIDX_MAXMEM 的取值范围是 16KB 到 4294967295。在 onconfig.std 中,它的默认大小是 5120KB。

ONLIDX_MAXMEM 配置参数可以使用 onmode -wf 进行动态修改,或者使用 onmode -wm 命令取代它。

DROP INDEX ONLINE

DROP INDEX ONLINE 允许删除索引,而不需要独占锁。即使事务隔离级别为脏读,也可以删除索引(利用 ONLINE 关键字)。

使用 DROP INDEX ONLINE 语句删除索引的优点有:

  • 可以直接删除低效的索引,而不会干扰正在运行的查询,即使有查询正在使用该索引也仍然可以删除它
  • 查询优化器会获得通知,被告知不要将这个索引用于表上的新的 SELECT 操作

在表更新完成之后才能执行 DROP INDEX ONLINE。发出 DROP INDEX ONLINE 语句之后,新的操作不能引用该索引,但是当前的操作可以使用该索引,直到操作完成。数据库服务器等到所有当前用户访问完索引之后才删除索引。

清单 15 包含带 ONLINE 语法使用 DROP INDEX 的例子。

清单 15. 带 ONLINE 语法使用 DROP INDEX 的示例
DROP  INDEX  i1  ONLINE

索引自连接

索引自连接是指一个表与它自身进行连接的一种连接。在以下情况下,索引自连接可以帮助提高性能:

  • 查询涉及引导键,或者索引的最重要的列(通常是第一个列)有很多重复
  • 用一个引导键检查的成本或行数大于检查非引导键列返回的行数的成本

理解其中的工作原理的方法是考虑查询被拆分成有很多子查询的联合 (union)。每个子查询是非限制性引导键列的结果集。然后,优化器可以考虑那些列,并使用它们发现更有限制性的非引导键列。

创建索引自连接

要创建自连接,可使用别名,以便可以在 from 子句中两次列出同一个表,如 清单 16 中所示。

清单 16. 生成自连接的示例语法
SELECT  a1.customer_num
FROM  customer  a1,  customer  b1
WHERE  a1.customer_num  =  b1.customer_num  AND
...  Additional  logic  here

请注意,两个别名都引用了同一个表。

自连接查询计划和 sqexplain 输出

在查询计划中可以使用集解释输出 (set explain output) 很简单地确定自连接,如 清单 17 中所示。

清单 17. 显示自连接的集解释输出的示例
Index  Self  Join  Keys  (customer_num  lname  )
  Lower bound: informix.a.customer_num >= 00702 AND 
  (informix.a.lname >= 'Aaron ' )
  Upper bound: informix.a.customer_num <= 12345 AND
  (informix.a.lname <= 'Croyle' )

请注意,索引自连接中涉及的列中的键将会显示出来。

自连接优化器指令

以下两个优化器指令可用于指示优化器使用自连接功能:

  • INDEX_SJ 指令强制索引自连接路径使用指定的索引,或者从索引列表中选择成本最低的索引,即使没有关于引导索引键列的数据分布统计信息也是如此。
  • AVOID_INDEX_SJ 指令防止自连接使用指定的索引或索引列表。

使用 NO_SORT 索引参数和 NO_SORTINDEX 环境变量

NO_SORT 是一个用于创建索引的新选项,有助于提升在一些特殊场景(比如静态集群表)中的性能。有了 NO_SORT,就可以使用一个返回数值空间键的函数,根据一个函数 B-树索引创建静态集群表。当在生成的集群表上创建一个 R-树索引时,R-树辅助访问方法不需要对数据排序。它将自下而上创建索引,因为已经根据自下而上创建 R-树时所用的标准对表进行了排序。排序由 B-树函数索引完成。

要使用 NO_SORT 索引参数创建 R-树索引,请执行以下步骤:

  1. 查看 DataBlade 模块文档,找到可根据给定的被索引数据类型对象返回空间键的函数。
  2. 使用这个函数在表上创建一个集群函数 B-树索引,如 清单 18 中所示。
    清单 18. 使用 DataBlade 函数在表上创建一个集群 B-树索引
    CREATE CLUSTER INDEX btree_functional_index ON table1 (SpatialKey(col1));

    btree_functional_index 是集群函数 B-树索引的名称。table1 是表的名称。SpatialKey 是创建的函数。col1 是包含空间数据的列的名称。

  3. 使用语法 NO_SORT="YES" 在空间键组成的列上创建一个 R-树索引,如 清单 19 中所示。
    清单 19. 使用语法 NO_SORT="YES" 在空间键组成的列上创建一个 R-树索引
    CREATE  INDEX rtree_index  ON  table1  (col1 op1)
    USING  RTREE  (NO_SORT  =  'YES');

    rtree_index 是 R-树索引的名称。op1 是与列 col1 有关联的操作符类型的名称。

  4. 丢弃目前不相干的 B-树索引,如 清单 20 中所示。
    清单 20. 丢弃目前不相干的 B-树索引
    DROP  INDEX  btree_functional_index;

NOSORTINDEX 环境变量

如果环境中设置了 NOSORTINDEX 环境变量,那么创建 R-树索引的默认行为等同于设置了 NO_SORT="YES"

树林 (FOT) 索引

可以使用新的树林 (FOT) 索引模式提高索引搜索性能,该模式是在 Informix 11.70 中引入的。单个大型的 B-树索引被多个较小的 B-树索引所取代。FOT 索引通过计算索引中一个或多个列的哈希值来构建。查询会计算该值的哈希值并跳转到 FOT 索引中的正确索引。索引的更高级别是最常访问的一些页面。FOT 索引通过减少对顶层索引页面的大量访问来减少争用。

要创建一个 FOT 索引,可以向 CREATE INDEX 语句添加 HASH ON 子句,如 清单 21 中的示例所示。

清单 21. 创建 FOT 索引的示例
 CREATE INDEX idx1 ON tab1(c1) HASH ON (c1) WITH 100 BUCKETS;
CREATE INDEX idx2 ON tab2(c1, c2, c3) HASH ON (c1, c2) WITH 10 BUCKETS;

对索引清除进行调优

BTSCANNER 配置参数是在 Informix 10.00 中引入的。最近,还以自适应线性索引清除(alice 模式,Informix 11.10)和压缩 (Informix Dynamic Server 11.50) 的形式添加了一些新功能。

启用了 alice 模式的扫描(仅限日志数据库)会保留每个索引分区的一个位图,显示标记用于清除的索引键。对标为 “删除” 的项进行的清除扫描不包括不应执行任何删除的索引。与更早的范围扫描方法相比,使用 alice 模式提供了显著的性能改进。alice 模式不适用于具有多个附加索引的表,在这些表中应该使用叶扫描。

B-树压缩旨在将一个 B-树索引的大小保持在一个对有效搜索最有利的级别。压缩设置用于设置合并部分已填充的索引页面的阈值。

清单 22 显示了 BTSCANNER 的 onconfig.std 值。

清单 22. BTSCANNER 示例
BTSCANNER num=1, threshold=5000, rangesize=-1, alice=6, compression=default

服务器会启动 num 线程,并在一个活动表上放置索引,以便在它达到要删除的项数量的 threshold 时执行清除操作。rangesize 是一个以 KB 为单位的大小值,索引分段超过该值之后,才会通过范围扫描清除操作来清除索引。对于 Informix 11.10 及其更高版本,建议将此值设置为 -1(关闭),以便在适当时候使用 alice 模式。alice 参数可以设置初始位图大小。对于中小型系统,可将它设置为 6 或 7;对于预计很大的系统,应将它设置为更大的值。根据您在系统上想要的处理行为,可以将 compression 设置为 default (medium)、low、medium 或 high。

随着索引增长或精简,您想要的压缩设置可能会有所更改。管理 API(sysadmin 数据库)有一个更改该设置的内置函数,如 清单 23 中所示。

清单 23. 更改压缩设置
EXECUTE FUNCTION task("set index compression","1048611","high");

在此示例中,拥有 1048611 个部分的索引的 compression 设置为 high。


使用并行数据库查询和 Memory Grant Manager 来提高性能

理解 PDQ

并行数据库查询 (Parallel database query, PDQ) 可以大大提高性能。PDQ 使数据库服务器可以分散查询的工作。例如,如果需要在一个大型表上创建索引,那么可以将这项工作分散到多个线程和进程。

分配和限制 PDQ 资源

PDQ 提供了资源管理功能。当数据库服务器使用 PDQ 并行执行一个查询时,可以在操作系统上执行较重的负载。您可以调优以下资源:

  • 内存
  • CPU VP
  • 磁盘 I/O(对于分段表和临时表空间)
  • 扫描线程

在配置数据库服务器时,必须考虑 PDQ 的使用对其他用户造成的影响。例如,如果运行的查询会占用所有 CPU 资源,那么数据库服务器就无法对其他通常运行得非常快的查询作出响应。因此您必须小心,让关键的非 PDQ 查询仍然能够以可以接受的性能运行。

可以用以下方法控制数据库服务器对资源的使用:

  • 限制并行数据库查询的优先级
  • 调整 Memory Grant Manager 中的内存大小
  • 限制扫描线程的数量
  • 限制并发查询的数量

PDQPRIORITY

PDQPRIORITY 环境变量确定资源的并行度。该变量和 MAX_PDQPRIOIRTY 一起用作关于数据库服务器如何分配资源的比例因子,如 清单 24 中所示。

清单 24. 设置 PDQPRIORITY 环境变量
setenv--PDQPRIORITY--+-HIGH--------------------------------+
                     +-LOW---------------------------------+
                     +-OFF---------------------------------+
                     '-resources--+------------------------+
                                  |     (1)                |
                                  '-------------high_value-'

表 6 给出了 PDQPRIORITY 设置。

表 6. PDQPRIORITY 设置
设置说明
High当数据库服务器在所有用户之间分配资源时,它会将尽可能多的资源提供给查询。
Low 或 1并行地从分段表中取数据值。
OFFPDQ 处理被关闭。
resources0 到 100 之间的整数;设置实际分配给查询的用户请求的 PDQ 资源的百分比。
可选的较高值请求内存最大百分比的可选整数值。当在 resources 值之后指定这个值时,会以百分比的形式请求提供一个内存范围。

数据库服务器专用于某个查询的资源越多,通常就能越快地完成此查询。但是,如果其他查询也尝试获取同样的资源,就会发生对这些资源的竞争,这会导致性能下降。

可以使用 SQL 语句 SET PDQPRIORITY 手动调整特定会话的优先级。

用 MAX_PDQPRIORITY 限制优先级

MAX_PDQPRIORITY 是限制数据库服务器可分配给任意 DSS 查询的 PDQ 资源的 ONCONFIG 参数。MAX_PDQPRIORITY 是任何特定客户机请求的资源占 PDQPRIORITY 的百分比。例如,假设一个用户急于获得数据,因而将 PDQPRIORITY 设为 100。但是 DBA 认识到每天晚上的同一个时候需要运行一些批处理任务,因此将 MAX_PDQPRIORITY 设为 50。100 的 50% 是 50,因此用户实际上可以获得的最大 PDQPRIORITY 资源数为 50。

当数据库服务器在线时,可以使用 onmode -D 修改 MAX_PDQPRIORITY 的值。

在同时具有 OLTP 和 DSS 查询的系统上,必须采取均衡措施。如果将 MAX_PDQPRIORITY 设置得太高,则不利于 OLTP 查询。如果将该值设置得太低,则 DSS 查询无法获得令人满意的性能。所以,DBA 必须小心地调优这个变量。

可以将 MAX_PDQPRIORITY 设置为 表 7 中描述的值。

表 7. MAX_PDQPRIORITY 设置
设置说明
0关闭 PDQ。DSS 查询不使用并行。
1并行地从分段表中取数据(并行扫描),但是不使用其他形式的并行方式。
100使用所有可用的资源并行地处理查询。
任意数值0 到 100 之间的一个整数;设置实际分配给查询的用户所请求的 PDQ 资源的百分比。

用 Memory Grant Manager 调整内存资源

ONCONFIG 参数 DS_TOTAL_MEMORY 参数指定可用于 PDQ 查询的内存大小。这个值单位为 KB,它从 Informix 实例共享内存的虚拟内存分配。应该将 DS_TOTAL_MEMORY 设置得足够大,以便可以一次性地将较大的工作装入内存。以下是在配置 DS_TOTAL_MEMORY 时需要考虑的一些因素:

  • 计算机上的总内存大小(不要超过它)
  • 开销,例如缓冲池
  • 计算机上的其他进程。如果由于这个值设置得太高而导致分页或交换,则会减少性能优势,实际上反而会降低性能。

SHMTOTAL 指定用于数据库服务器的所有内存(常驻内存、虚拟内存和消息内存这几部分的总和)。SHMVIRTSIZE 指定共享内存中虚拟内存的初始大小。

向 PDQ 查询分配更多虚拟内存会导致动态添加一个或多个虚拟共享内存段。每次将额外的段添加到共享内存,都会给某些操作系统带来一定的性能开销。按照以下方法适当地调节 SHMVIRTSIZESHMTOTAL,以便分配最少数量的内存段,从而避免这种性能下降:

  • 对于 OLTP 应用程序,基本建议是将 DS_TOTAL_MEMORY 设置为 SHMTOTAL 值的 20% 到 50%,单位为 KB。
  • 如果 DSS 查询独占地使用数据库服务器,则将 DS_TOTAL_MEMORY 设置为 SHMTOTAL 的 90% 到 100%。
  • 对于同时使用两种类型的查询的系统,基本建议是将 DS_TOTAL_MEMORY 设置为 SHMTOTAL 的 50% 到 80%。

可以使用 onmode -M 命令动态地设置 DS_TOTAL_MEMORY

请注意,DS_TOTAL_MEMORY 允许使用的值与平台有关。对于 32 位平台,这个值必须是 128 * DS_MAX_QUERIES 到 1,048,576 之间的一个无符号整数。而在 64 位系统上,限制范围通常更大一些,具体范围因操作系统而异。例如,在 HP 9000 平台上,最大值是 4,294,967,296。

限制扫描线程的数量

ONCONFIG 参数 DS_MAX_SCANS 参数限制可以并发运行的 PDQ 扫描线程的数量。如果将这个参数设置得太高,那么数据库服务器就有太多来自多个并发运行的决策支持查询的扫描线程。这将导致资源竞争和 onstat -g mgm 中的就绪队列增长。

可以使用 清单 25 中的公式计算分配给一个查询的扫描线程的数量:

清单 25. 计算分配给某个查询的扫描线程的数量
scan_threads 
= min (-nfrags-, (DS_MAX_SCANS * -pdqpriority- / 100 * MAX_PDQPRIORITY / 100) )

-nfrags- 是最大数量分段的表中的分段数量。-pdqpriority- 是用于该特定查询的设置。

可以使用 onmode -S 选项动态地设置扫描线程的最大数量。这个值必须是 10 到 1,048,576 之间的一个无符号整数。

假设一个大型表包含 50 个分段。如果没有设置 DS_MAX_SCANS,那么允许使用的并发扫描数量是没有限制的。数据库服务器将分配 50 个扫描线程。引擎会尝试运行所有 50 个扫描线程来读取此表。如果此报告可供任何用户运行,并且碰巧有 50 个人在同时尝试运行该报告,情况会怎样?引擎不会进行检查,它将为该报告的每次运行分配 50 个线程。因此总共会产生 2500 个线程。如果增加其他报告和其他 DSS 的开销,则可能产生严重的争用问题。可使用 DS_MAX_SCANS 防止此类问题发生。

数据库性能调优的均衡性质可在这一方面的 PDQ 调优中得到体现。为了减少大型查询的扫描线程在就绪队列中的等待时间,可以减少分配的扫描线程数量。但是,如果某个查询的扫描线程数量少于片段数量,则会需要花更长的时间来执行查询。

限制并发 PDQ 查询的数量

DS_MAX_QUERIES 是指定可以并发运行的 PDQ 查询的最大数量的 ONCONFIG 参数。Memory Grant Manager (MGM) 根据清单 清单 26 中的公式为一个查询预留内存。下面的公式展示了数据库服务器如何决定将多少内存分配给一个查询:

清单 26. 为一个查询预留内存
memory_reserved = DS_TOTAL_MEMORY * (PDQ-priority/100) * (MAX_PDQPRIORITY/100)

可以使用 onmode -Q 命令动态地设置 DS_MAX_QUERIES

使用 Memory Grant Manager

onstat -g mgm 选项打印 Memory Grant Manager (MGM) 资源信息。可以使用 onstat -g mgm 选项监视 MGM 如何协调内存使用和扫描线程。清单 27 显示了示例输出。

清单 27. 示例 onstat -g mgm 输出
IBM Informix Dynamic Server Version 11.50.FC9 -- On-Line -- Up 00:00:24 -- 250944 Kbytes

Memory Grant Manager (MGM)
--------------------------

MAX_PDQPRIORITY:  100
DS_MAX_QUERIES:    4
DS_MAX_SCANS:      1048576
DS_NONPDQ_QUERY_MEM: 128 KB
DS_TOTAL_MEMORY:   512 KB

Queries:   Active     Ready   Maximum
                0         0         4

Memory:     Total      Free   Quantum
(KB)          512       512       128

Scans:      Total      Free   Quantum
           1048576   1048576         1

Load Control:    (Memory)      (Scans)  (Priority)  (Max Queries)   (Reinit)
                   Gate 1       Gate 2      Gate 3         Gate 4     Gate 5
(Queue Length)          0            0           0              0          0

Active Queries:  None

Ready Queries:  None

Free Resource        Average #        Minimum #
--------------    ---------------     ---------
Memory              47.8 +- 2.7            32
Scans             1048575.3 +- 0.0          1048574

Queries              Average #        Maximum #    Total #
--------------    ---------------     ---------    -------
Active               1.0 +- 0.1             2       3371
Ready                0.0 +- 0.0             0          0

Resource/Lock Cycle Prevention count: 0

MGM 使用一系列关卡(如 表 8 中所示)来确保 PDQ 查询有足够的资源来正确运行。

表 8. 关卡的描述
关卡编号说明
1是否有足够的可用内存?
2是否超过了 DS_MAX_SCANS?
3这个关卡是所有具有相同优先级的查询的一个队列
4是否超过了 DS_MAX_QUERIES?
5确保在允许队列运行之前不动态更改资源

份额

份额 为单位为 PDQ 查询分配内存。可供一个查询使用的份额数量由可用于该查询的 PDQ 资源的百分比确定。onstat -g mgm 输出显示了一个份额的大小。份额的大小可以通过 清单 28 中所示的方法进行计算。

清单 28. 计算份额
memory quantum = DS_TOTAL_MEMORY/DS_MAX_QUERIES

作为一个例子,我们可以回头看看 清单 27 的示例输出,清单 29 展示了如何插入数字。

清单 29. 份额计算示例
memory quantum = 512/4

运行该示例会生成一个 128000 字节的份额。

根据数学原理,您允许执行的查询越多,一份份额将会越小。


最大化检查点

Informix Dynamic Server 在共享内存中执行它的所有工作。该服务器尽可能在共享内存中保存页面,以避免不必要的 I/O。例如,可在独立事务中向一个数据页插入行,无需在每个事务中从磁盘读取该页面,修改并写回到磁盘中。但是,在某个时刻,数据库服务器必须将该页面写回磁盘。必须为其他页面留出空间。

将修改的页面保留在内存中会带来恢复问题。如果数据库服务器意外离线,它可能会将修改过的页面保留在内存中,而不是写入到磁盘中。在恢复过程中,服务器在开始新的处理之前需要保持数据的一致性。这就是快速恢复的过程,它通过两步来完成:

物理恢复
物理恢复将所有页面的原像返回给磁盘。原像是页面在被修改之前的映像。
逻辑恢复
逻辑恢复是指前滚最近检查点中的所有事务。所有被提交的事务将被完整地重放。但是没有被提交的事务将被回滚。

检查点

检查点在磁盘与共享内存之间创建一个同步点。在同步之后,数据库服务器会拥有一个已知的一致点。在一个检查点期间,缓冲池中的所有缓冲区和逻辑日志缓冲区都会刷新到磁盘,以便稳定地存储它们。

当出现一个检查点时,会在逻辑日志中记录一条检查点记录,该记录还会记录在保留页面中。在恢复期间,会使用保留页面检查点记录来查找最后一个数据一致点,将该点用作快速恢复的起点。

理解以前版本中的检查点

在 V11 之前,以下情形会触发一个检查点:

  • 管理员事件,比如关闭引擎,添加一个数据块或 dbspace
  • 物理日志满了 75%
  • 逻辑日志空间中已有一个检查点:如果最老的逻辑日志(下一个要写入的日志)包含最新的检查点,那么 Informix 必须写入一个新检查点,然后才可重用该日志
  • ONCONFIG 参数 CKPTINTVL

所有 4 个触发器在 V11 中都得到了保留,但检查点之间的间隔可使用新功能修改。

Informix 需要一个检查点才能恢复,因为它是一个已知的一致点。检查点会受到 LOGSIZELOGFILES 配置参数的间接影响。当检查一个逻辑日志文件,查看它能否被释放(并写入)时,会检查它是否拥有最新的检查点。在释放它之前,数据库服务器必须在当前逻辑日志文件中写入一个新检查点记录。发生此操作的频率可能会影响创建检查点的频率。这在 V11 中通常不是一个很重要的因素。

如果物理日志非常大,那么较长的检查点间隔就可能导致快速恢复所需的时间增加。在数据库可用性至关重要的情形下发生引擎崩溃时,这可能具有决定性作用。在这种情形下,建议结合使用 CKPTINTVL 和一个具有适当大小的物理日志。

如果 CKPTINTVL 过期并且没有进行更新(没有物理地记录任何内容,也没有新的管理事件),则不会创建检查点。当发生一些页面更新或系统更改时,通常会采用一个更长的 CKPTINTVL 设置。

根据一些参数,比如物理日志缓冲区的大小、缓冲池的大小和存在多少脏缓冲区,检查点可能需要一定的时间才能完成。在 V11 之前,检查点常常会阻止任何线程进入一个关键代码段,即必须在一个单元内完成的代码,比如写入一个页面。这有时会导致用户应用程序等待检查点。数据库管理员常常会花大量时间来调优数据库参数,以便最大程度地减少阻塞。这常常会变成保持较低的脏缓冲区数量的工作,以便最大程度地减少在创建检查点期间清除的缓冲区数量。用于调优检查点的配置如下:

  • LRU_MIN_DIRTY 和 LRU_MAX_DIRTY 用于调优缓冲池中的脏缓冲区数量。
  • CHKPTINTVL 设置检查点之间的间隔。

但是,最小化缓冲池中的脏页面数量也意味着减少缓存的优势。

Informix V9 中引入的模糊检查点可用于减少创建检查点期间的磁盘写操作。模糊检查点已不推荐使用并被 Informix V11 中的新配置参数所取代。

了解影响检查点的新配置参数

Informix V11 中引入了 2 个影响检查点的新配置参数。本教程将在后面专门介绍自动调优的一节中更详细地介绍它们。

对于检查点调优,您可以选择保留以前版本中提供的检查点,或者使用新功能。新功能参数如下所示:

  • AUTO_CKPTS 修改检查点频率以阻止由于缺乏资源而导致的阻塞。
  • AUTO_LRU_TUNING 增加了 LRU_MIN_DIRTYLRU_MAX_DIRTY,用它们来阻止前台写入。
  • RTO_SERVER_RESTART 设置了检查点间隔,以实现配置的快速恢复时间。在启用 RTO_SERVER_RESTART 时,会忽略 CHKPTINTVL

使用无阻塞检查点

Informix V11 中重新设计了检查点算法。新算法几乎是无阻塞的。V11 数据库服务器允许在以前的引擎中阻塞的线程在一个检查点期间运行。

用于无阻塞检查点的 LRU 调优

在 V11 之前,数据库管理员常常将 LRU 刷新调得更频繁,以便不断地排出 LRU。因此,检查点会更快地完成,因为要做的工作更少了,这同时也减少了完成其他线程等待检查点所需的时间。

现在不再需要将 LRU 是刷新调得如此频繁。因为在检查点期间事务不会受到阻塞,您通常可以保持比 V11 以前的引擎中的做法高得多的 LRU_MIN_DIRTYLRU_MAX_DIRTY 值。在检查点期间处理的脏缓冲区数量高得多,检查点所花时间往往要长得多。但是,由于更少的 LRU 刷新和更多脏页面缓存,这可以提高性能。

检查点会临时阻塞处理的地方

在推出的无阻塞检查点中,检查点过程的某些方面并未更改。在检查点处理期间,事务仍然会将之前的映像写入物理日志,将事务记录写入逻辑日志。引擎必须在逻辑日志范围内至少写入一个检查点。如果日志资源在检查点期间变得太少,以下情况下会触发可能受阻塞的检查点:

  • 物理日志满了 75%
  • 需要检查点,因为逻辑日志几乎是跨区的

为无阻塞检查点配置引擎

为了避免检查点阻塞事务处理,请完成以下步骤:

  • 打开自动检查点特性。更频繁的检查点将出现。这可以防止由于缺少资源而发生阻塞。
  • 增加物理日志或逻辑日志的大小。服务器将在在线日志中放置一条消息,建议增加哪种资源,以及它的大小应该是多少。

管理检查点的更多考虑因素

ONDBSPACEDOWN 是一个配置参数,指示服务器将如何处理一个 I/O 错误导致的一个非镜像常规 dbspace 故障。根据设置,引擎可能在一个检查点期间挂起。临时 dbspace 不会受到 ONDBSPACEDOWN 的影响。

在完成检查点之后,会在在线日志中读取一条消息。此消息还会指定一个检查点需要花多长时间来完成。在 V11 之前,这也是针对用户被挡在关键代码段之外的时间的一种临时规范。DBA 可以使用此信息帮助调优他们的检查点。您可以使用 onstat -m 读取这些消息。

一个新的 onstat 选项 (-g ckp) 支持您跟踪以前的 20 个检查点的检查点历史。该 onstat 选项提供了检查点持续时间。它还提供了触发检查点的触发器,这应该对配置很有用。


了解表压缩和碎片整理

对磁盘空间的低效使用可能降低性能。如果空间利用率低(删除可释放大量行空间),那么给定数据集检索的 I/O 就会增加。当表页面分散在多个盘区时,需要更长的搜寻时间才能找到数据。可以与压缩独立地进行重新封装和精简。重新封装会合并空闲空间,精简会将空闲空间返回给 dbspace,尽可能地减小了盘区。重新封装可在引擎离线时执行。

碎片整理通过尽可能重新定位和合并盘区来解决第二个问题。

表压缩和碎片整理通过管理 API 执行。以下是一些管理 API 命令的示例:

清单 30. 重新封装 API 命令
EXECUTE FUNCTION task("table repack", "table_name", 
"database_name", "owner_name");
清单 31. 精简 API 命令
EXECUTE FUNCTION admin("table shrink",
"table_name", "database_name", "owner_name");
清单 32. 碎片整理 API 命令
EXECUTE FUNCTION task("defragment", "database_name:owner_name.table_name");

可以使用 Open-Admin Tool (OAT) 管理这些操作,它们也可进行计划。


进行更多性能改进

新的分段选项简介

在 Informix 11.70 之前,分段是通过轮循机制 (round robin) 和表达式来完成的。在 Informix 11.70 中,有两种新的分段模式可用:内部和列表。内部策略提供了一种允许在未知值上进行分段的机制。列表策略允许用户在离散值上进行分段。

在备份和还原期间改进的并行性

本节将介绍在备份和还原期间使用的新的并行性方法。

使用 BAR_MAX_BACKUP 的 OnBar 并行完整系统备份

在 V11 之前,整个系统备份是单线程的,会为所有 dbspace 记录一个归档检查点时间戳,并按顺序归档检查点。在 V11 中,并行完整系统备份可通过适当配置 BAR_MAX_BACKUP 来完成,如 表 9 中所示。

表 9. 设置 BAR_MAX_BACKUP
BAR_MAX_BACKUP 设置说明
Unset创建 4 个并行进程
0允许引擎决定。引擎分配存储空间数量或共享内存中可容纳的数量中较少的值。
1顺序(单线程)归档和还原
#备份过程的开始数字

在备份 rootdbs 之前,会对所有 dbspace 执行一个检查点。根 dbspace 首先归档并且没有并行性。在这一刻之前,它的行为与以前的版本相同。

从 V11 开始,剩余 dbspace 的备份是按一种新顺序执行的。这种顺序与用于非完整系统备份的顺序相同。系统会为每个 dbspce 启动一个前像 (before-image) 处理器线程 (arcbackup2)。该操作支持并行运行更多线程。在完成每个 dbspace 备份后,相应的 arcbackup2 线程也会退出,使得在备份过程中占用资源的 arcbackup2 线程更少。

新 dbspace 备份顺序基于在开始备份时使用的页面数量。要备份的 dbspace 按 dbspace 中已使用页面数量的降序排序。这可以确保获得更好的并行性。无论将 BAR_MAX_BACKUP 设置为什么值或要归档多少页面,都可以采用这种顺序。

创建用户定义的 VP

可以创建特殊类型的虚拟处理器,以便运行用户定义例程或者执行 DataBlade 模块的工作。用户定义例程通常用于支持用户定义数据类型。如果不想在 CPU 类 VP 中运行用户定义例程,那么可以将它指派给用户定义类型的虚拟处理器 (VP)。用户定义虚拟处理器的另一个名称是扩展虚拟处理器

确定所需的用户定义虚拟处理器的数量

如果可以并行处理 UDR,那么应该配置足够多的用户定义虚拟处理器,以便处理 UDR 负责的多个任务。数据库服务器将支持操作系统所允许的用户定义 VP 的数量。

使用用户定义的虚拟处理器

用户定义虚拟处理器可以避免数据库服务器受到行为不当的用户定义例程的影响。所有行为不当的用户定义例程至少有以下特征之一:

  • 不会将控制权让给其他线程
  • 阻塞操作系统调用
  • 修改全局 VP 状态

将任何行为不当的用户定义例程指派给用户定义虚拟处理器,可以使数据库服务器避免不安全的执行,从而提高数据库的可靠性。用户定义 VP 消除了 CPU VP 的以下编程限制:

  • 需要定期派生处理器。由于在扩展虚拟处理器上只有一个运行 UDR 的线程,因此不需要派生处理器。
  • 需要避免阻塞 I/O 调用。

在用户定义的虚拟处理器上运行的 UDR 不需要派生处理器。它们可以发出文件系统调用,阻止处理器在 I/O 完成之前执行进一步处理。当这些 UDR 在用户定义的虚拟处理器而不是 CPU VP 上运行时,对其他运行线程的影响会有所减轻。

指定用户定义的虚拟处理器

VPCLASS 选项用于定义一个新的 VP 类型。这个类型的名称与 UDR 中定义的 CLASS 相对应。

向一个用户定义的虚拟处理器类型分配一个 UDR

CREATE FUNCTION 语句注册了一个用户定义的例程。函数名称已经定义,沿用了返回类型以及在其中运行该函数的类的名称。

例如,清单 33 中定义了用户定义例程 MoodyBluesOrNot。它指定给定的参数类型是 char,并定义返回类型为 BOOLEAN。注意,清单中还指定了类型名称。这意味着对该例程的调用是在名为 ALC 的用户定义 VP 类型中运行。

清单 33. 创建 UDR 的示例 SQL
CREATE  FUNCTION  AllLowerCase(char)
RETURNS  boolean
WITH  (CLASS  =  ALC  )
EXTERNAL  NAME  '/usr/lib/objects/udrs.so'
LANGUAGE  C

ONCONFIG 文件必须包含一个 VPCLASS 参数,该参数定义了 ALC 类型。否则,对 AllLowerCase 函数的调用将失败。


理解 Informix 自调优

Informix 会在多个区域调优自身。

自动检查点

ONCONFIG 参数 AUTO_CKPTS 支持使用自动检查点,默认情况下已启用该功能。数据库服务器自动调整检查点频率以避免事务阻塞。本教程前面已提到,物理和逻辑使用锁触发的检查点可能会阻塞处理。在自动检查点生效后,服务器会监视物理和逻辑日志的使用情况,以及有关过去的检查点性能的信息。服务器会更频繁地触发检查点,以避免事务阻塞。Informix 向 sysmaster 数据库添加了以下两个表来保存检查点数据。

  • syscheckpoint 表保存最近 20 个检查点的历史。
  • sysckptinfo 表跟踪检查点活动。

因为数据库服务器在检查点处理期间没有阻塞事务,应该减少 LRU 刷新频率。如果服务器无法在使用物理日志之前完成检查点处理(这会导致事务阻塞),并且如果您无法增加物理日志的大小,您可以为服务器配置更频繁的 LRU 刷新。

LRU 刷新频率的增加影响了事务性能,但它应该会减少事务阻塞。如果没有将服务器配置为更频繁的刷新,那么在无法找到低优先级缓冲区来进行页面替换时,服务器会自动将 LRU 刷新调整得更频繁。

您可以通过运行 onmode -wf AUTO_CKPTS=0 或将 AUTO_CKPTS 配置参数设置为 0 来禁用自动检查点调优。

LRU 的自动调优

针对具有内部检查点的每个缓冲池的 LRU 刷新设置对 V11 中的检查点性能的影响不太大。LRU 设置有必要用于维护足够的干净页面用于页面替换,这使 LRU 刷新变得不那么频繁。

从 V11 开始,数据库服务器会在发生页面替换时自动调优 LRU 刷新。用于此功能的新的配置参数是 AUTO_LRU_TUNINGAUTO_LRU_TUNING 配置参数指定在服务器启动时启用还是禁用自动 LRU 调优。

如果已启用 AUTO_LRU_TUNING,在一个检查点后,如果在前一个检查点间隔发生了页面替换前台写入操作,数据库服务器会将 LRU 设置降低 5%。服务器会在每个后续的检查点上继续降低 LRU 刷新频率,直到页面替换前台写入点或给定缓冲池的 LRU_MAX_DIRTY 低于 10%。例如,如果发生一个页面替换前台写入操作并且一个缓冲池的 LRU 设置为 80 和 90,数据库服务器会将这 5% 调整为 76 和 85.5。

只要一个故障页面替换了一个热页面(高优先级缓冲区)并且低优先级缓冲区位于修改的 LRU 队列上,就会将 LRU 刷新调节得更频繁。自动 LRU 调节只会使 LRU 刷新更频繁;它们不会降低 LRU 刷新频率。

LRU 刷新重置为数据库服务器启动时使用的 ONCONFIG 文件中包含的值。

自动 LRU 调优会影响所有缓冲池,调整 BUFFERPOOL 配置文件中的 LRU_MIN_DIRTYLRU_MAX_DIRTY 值。

AUTO_LRU_TUNING 默认情况下已在配置文件中启动。只需使用 onmode -wmonmode -wf,便可以动态地启用或禁用 LRU 调优。

恢复时间目标 (RTO) 策略

Informix V11 引入了配置参数 RTO_SERVER_RESTART,它配置了数据库服务器尝试完成恢复并返回到在线或休眠模式所用的秒数。此参数在服务器需要在崩溃后的给定时间内上线时很有用。恢复时间很难手动估算,因为用户不知道恢复所需的总 I/O。

恢复过程首先从物理日志将数据页面前像读入缓冲池中。然后使用逻辑日志前滚提交的事务和后滚未提交的事务。要完成恢复时间目标,Informix 必须管理在恢复期间发生的 I/O 量。

在配置 RTO_SERVER_RESTART 时,服务器会维护从上一个检查点以来所使用的物理和逻辑日志空间的最新信息,还会维护在快速恢复期间可用于访问这些日志的 I/O 速度。重新启动服务器的时间也是已知的。使用这些数字,服务器可确定维护重新启动策略所需的检查点间隔。

在引擎处于上线状态时,需要打开 RTO_SERVER_RESTART,因为页面可能被标记为在快速恢复期间填充到缓冲池中。只有在回收资源之后,才会实现相关收益。

当启用 RTO_SERVER_RESTART 时,数据库服务器会执行以下任务:

  • 通过触发更频繁的检查点,确保自动检查点不会耗尽关键资源(比如逻辑空间)并受阻塞
  • 忽略配置参数 CKPTINTVL 并设置一个计算的检查点间隔
  • 自动调整 AIO 虚拟处理器和清洁线程 (cleaner thread) 的数量
  • 自动调优 LRU 刷新以容纳增加的检查点数量

请注意,如果启用了 RTO_SERVER_RESTART,AIO 虚拟处理器、清洁线程和 LRU 刷新会自动调整,无论启用了 AUTO_AIOVPS 还是 AUTO_LRU_TUNING

以下是启用 RTO_SERVER_RESTART 的一些缺点:

  • 存储用于逻辑恢复的页面会增加物理日志活动,这可能影响事务性能
  • 获得更高的检查点频率,但可以通过增加物理日志大小来减轻这一情况

在最低限度上,总日志空间的大小只需足够包含两个检查点周期的所有事务即可。在启用了 RTO_SERVER_RESTART 并且服务器拥有小于 4GB 的组合缓冲池大小时,建议的总日志空间为组合的缓冲池大小的 110%。

两个新 ONCONFIG 参数 RAS_PLOG_SPEEDRAS_LLOG_SPEED 存储在快速恢复期间恢复物理和逻辑日志的速率,用于计算 RTO 策略的检查点间隔。RAS_PLOG_SPEED 会在初始化物理日志时进行初始设置。RAS_LLOG_SPEED 初始化为 RAS_PLOG_SPEED 的 1/8。

每次发生快速恢复时,都会更新这些值来反映真实的恢复速度。单位是页/秒。

IBM 在 ONCONFIG 文件中包含了 RAS_PLOG_SPEEDRAS_LLOG_SPEED,使将 Informix 潜入到其应用程序中的 DBA 能够提供预先计算的值,所以无需调优即可获得最优的性能。DBA 应该不需要更改这些值,除非在 IBM 技术支持人员的指导下。

默认情况下会禁用 RTO_SERVER_RESTART。允许为此配置参数配置的值范围如下所示:

  • 如果 RTO_SERVER_RESTART 已关闭,值范围为 0。
  • 如果 RTO_SERVER_RESTART 已开启,值范围是 60-1800 个页面/秒。

您可以通过手动修改配置文件或使用 onmode -wf RTO_SERVER_RESTART 来更改 RTO_SERVER_RESTART 配置参数。RTO_SERVER_RESTART 的新配置值在数据库停止并重新启动后生效。

在 Informix V11 中,已不推荐使用模糊检查点。因此,新的检查点算法需要更多物理日志活动。为 Informix V7 配置的应用程序应该只会察觉到物理日志活动速度的细微变化或没有变化。在 V9 上运行的应用程序可能会体验到物理日志增加。启用 RTO_SERVER_RESTART 也会导致物理日志活动增加。

大型物理日志不会影响性能。1GB 到 4GB 的典型物理日志大小通常就足够用了。

CPU 虚拟处理器的动态添加

这是 Informix 11.70 中的一项新功能。如果将 SINGLE_CPU_VP 设置为 0,并且启用了 sysadmin 数据库的 ph_task 表中的 auto_tune_cpu_vps 任务,多处理器机器上的数据库服务器会自动添加 CPU VP。服务器会添加物理处理器数量的最多一半的虚拟处理器,最多达到(配置为自动添加)8 个虚拟处理器。如果您需要多于 8 个 CPU VP,则必须对它们进行配置。该增加操作是在启动时进行的,会向 online.log 打印一条有关动态添加 CPU VP 的消息,如 清单 34 中所示。

清单 34. 有关动态添加 CPU VP 的消息
15:45:27  Dynamically added 3 cpu VPs

自动 AIO VP 调优

从 IBM Informix V11 开始,您可以使用 AUTO_AIOVPS 配置参数来启用 AIO VPS 数量的自动调整,并在服务器检测到 AIO VP 无法处理 I/O 工作负载时刷新线程。

AUTO_AIOVPS 默认情况下已在配置文件中启用。可以使用 onmode -wmonmode -wf 来动态启用或禁用 AIO VP 的自动增加并刷新线程。


结束语

本教程介绍了 Informix 中的一些新的性能改进功能。本教程内容如下:

  • 介绍了通过配置操作系统从 Informix 中获得最大收益时需要考虑的一些操作因素。
  • 探讨了 ONCONFIG 文件,重点介绍了配置它来实现操作系统资源的最佳用法。
  • 解释了无阻塞检查点,它们可带来显著的性能提升。
  • 探讨了一些更新统计信息,包括统计信息维护,它将引导优化器选择最快的查询计划。
  • 探讨了一些性能增强和索引功能,包括自连接和 NO_SORTINDEX
  • 介绍了数据库服务器的的自调优功能。

您现在应该为参加 Informix v11.70 系统管理认证考试 919 的第 4 部分做好了更充分的准备。

请继续学习 认证系列中的其他部分

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=829852
ArticleTitle=Informix 11.70 系统管理认证考试 919 准备教程,第 4 部分: 性能调优
publish-date=08092012