为此注册表变量设置较高的值可能具有下列优点:将需要更少的分配以达到缓冲池的期望内存量。
为此注册表变量设置较高的值可能会增加成本,这是因为如果缓冲池的更改量不是分配大小的倍数,那么会浪费内存。例如,如果 DB2_ALLOCATION_SIZE 的值为 8 MB,而缓冲池减少了 4 MB,那么由于不能释放整个 8 MB 段,所以这 4 MB 将会浪费。
将 DB2_APM_PERFORMANCE 设置为 ON 也会启用无包锁定方式。此方式允许全局查询高速缓存运行,而不必使用包锁定,这些锁定是内部系统锁定,可以保护高速缓存的包条目不会被除去。NO PACKAGE LOCK 方式可能会使性能有较小的提高,但它不允许执行某些数据库操作。这些被禁止的操作可能包括:使包无效的操作、使包不起作用的操作、PRECOMPILE、BIND 和 REBIND。
在执行 db2start 命令时激活 DB2ASSUMEUPDATE 注册表变量有效。
指定操作系统是否对备份映像进行高速缓存。缺省行为是对该映像文件进行高速缓存。如果 DB2_BACKUP_USE_DIO 设置为 ON,那么备份映像文件直接写至磁盘(绕过文件高速缓存)。
NO_NT_SCATTER = 1
NUMPREFETCHQUEUES = 2
假定 bpvars.vars 存储在 F:\vars\ 中,要设置这些变量,请发出以下命令: db2set DB2BPVARS=F:\vars\bpvars.vars
散射读参数
对于针对相应类型的容器有大量顺序预取的系统以及您已将 DB2NTNOCACHE 设置为 ON 的系统,建议使用这些散射读参数。这些参数仅在 Windows 平台上可用,它们是 NT_SCATTER_DMSFILE、NT_SCATTER_DMSDEVICE 和 NT_SCATTER_SMS。指定 NO_NT_SCATTER 参数以显式地禁止对任何容器进行散射读。特定参数用于对所指示类型的所有容器打开散射读。对于这些参数中的每个参数,缺省值为零(或 OFF);且可能的值包括:零(或 OFF)和 1(或 ON)。
预取调整参数
预取调整参数是 NUMPREFETCHQUEUES 和 PREFETCHQUEUESIZE。这些参数在所有平台上都可用,且可用于改进缓冲池数据预取。例如,请考虑期望的 PREFETCHSIZE 划分为 PREFETCHSIZE/EXTENTSIZE 预取请求的顺序预取。在这种情况下,请求会放置在预取队列中,将从该队列分派 I/O 服务器来执行异步 I/O。缺省情况下,DB2 数据库管理器为每个数据库分区维护一个大小为 max(200,2*NUM_IOSERVERS ) 的队列。在某些环境中,随着队列和/或不同大小的队列的增加,性能会得到提高。预取队列的数目应该最多为 I/O 服务器数目的一半。设置这些参数时,请考虑其他参数(例如,PREFETCHSIZE、EXTENTSIZE、NUM_IOSERVERS 和缓冲池大小)以及工作负载特征(例如,当前用户数)。
如果认为缺省值对于您的环境太小,首先稍稍增大该值。例如,您可以设置 NUMPREFETCHQUEUES=4 和 PREFETCHQUEUESIZE=200。以受控方式对这些参数进行更改,以便可以监视和评估这些更改的效果。
对于 NUMPREFETCHQUEUES,缺省值为 1,该值的范围是 1 至 NUM_IOSERVERS。如果将 NUMPREFETCHQUEUES 设置为小于 1,那么它将调整为 1。如果将它设置为大于 NUM_IOSERVERS,那么它将调整为 NUM_IOSERVERS。
对于 PREFETCHQUEUESIZE,缺省值为 max(200,2*NUM_IOSERVERS)。值的范围是 1 到 32767。如果将 PREFETCHQUEUESIZE 设置为小于 1,那么它将调整为缺省值。如果设置为大于 32767,那么它将调整为 32767。
只有在“当前已落实”语义对避免锁定争用没有帮助时,DB2_EVALUNCOMMITTED 才适用。如果设置了此变量,并且“当前已落实”语义适用于扫描,那么将不会跳过已删除的行,并且不会对尚未落实的数据进行谓词求值;而是,将处理行和数据的当前已落实版本。
并且,DB2_EVALUNCOMMITTED 只适用于使用“游标稳定性”或“读稳定性”隔离级别的语句。并且,执行表扫描访问时将无条件地跳过已删除的行,除非还设置了注册表变量 DB2_SKIPDELETED,否则不会跳过已删除的键。
在执行 db2start 命令时激活 DB2_EVALUNCOMMITTED 注册表变量有效。有关延迟锁定是否合适的决定则是在语句编译或绑定时作出的。
HIGH、MEDIUM 和 LOW 的缺省 I/O 优先级设置分别为 3、8 和 12;可以使用 DB2_IO_PRIORITY_SETTING 注册表变量来更改这些设置。
如果查询中的一个单选操作涉及多个不同的聚集操作并且处理器数与数据库分区数的比率很低(例如,比率小于或等于 1),那么可以使用 ENHANCED_MULTIPLE_DISTINCT 值来提高这种查询的性能。在不包含对称多处理器(SMP)的分区数据库环境中,应该使用此设置。
IXOR 选项(从 DB2 V9.7 FP2 发行版开始提供此选项)指定优化器将使用索引 OR 运算数据访问方法。
如果指定了 SNHD 值,那么优化器根据成本确定一个更加有效的单一分区、散列引导分区策略。在此方法下,无法真正以并行方式执行的操作将更加积极地被优化为在单个数据库分区(而非协调程序分区)上执行操作。
这些优化扩充功能并不能在所有环境中提高查询性能。您应执行测试,以确定各个查询的性能提高情况。
如果将此变量设置为 CONNECTION,那么将为应用程序释放一个表锁定,直到该应用程序回滚事务或者连接被重置为止。在落实之间,表锁定将继续挂起,删除表锁定的应用程序请求将被数据库忽略。表锁定仍然被分配给该应用程序。因此,当应用程序重新请求表锁定时,锁定已经处于可用状态。
对于可利用此优化的应用程序工作负载,性能应该会有所提高。然而,并行运行的其他应用程序的工作负载可能会受到影响。其他应用程序可能无法访问给定表,从而使得并行性过低。DB2 SQL 目录表不受此设置影响。CONNECTION 设置还具有上面描述的 ON 或 TRANSACTION 设置所具有的行为。
在进行语句编译或绑定时将检查此注册表变量。
使用大量虚拟内存的密集内存访问型应用程序可以通过使用大页或巨页来提高性能。要使 DB2 数据库系统可以使用大页或巨页,必须先将操作系统配置为使用大页或巨页。
要对 64 位 DB2 AIX 版上的代理程序专用内存启用大页(DB2_LARGE_PAGE_MEM=PRIVATE 设置),必须在操作系统中配置大页,并且实例所有者必须具有 CAP_BYPASS_RAC_VMM 和 CAP_PROPAGATE 能力。
在 AIX 5L™ 上,可以将此变量设置为 FCM。FCM 内存位于它自己的内存集中,因此必须将 FCM 关键字添加至 DB2_LARGE_PAGE_MEM 注册表变量的值,以便对 FCM 内存启用大页。
在 Linux 上,还要求 libcap.so.1 库可用。必须先安装此库才能使此选项起作用。如果此选项已打开,且该库不在系统上,那么 DB2 数据库会禁用大内核页并继续如常运作。
在 Linux 上,要验证大内核页是否可用,请发出以下命令:
cat /proc/meminfo
如果大内核页可用,那么应该显示下面三行(服务器上配置的内存量不同,显示的数字也会不同):
HugePages_Total: 200
HugePages_Free: 200
Hugepagesize: 16384 kB
如果没有看到这几行,或者 HugePages_Total 为 0,那么必须配置操作系统或内核。
在 Windows 上,系统上可用的大页内存量小于总可用内存。系统运行一段时间之后,内存就会被分段,大页内存量就会减少。DB2_ALLOCATION_SIZE 注册表变量应设置为较高值(例如,256MB),以便在 Windows 上分配大内存页时实现一致的性能。(请注意,DB2_ALLOCATION_SIZE 需要您停止然后重新启动该实例。)
如果应用程序在一个工作单元中包含数目极多的语句,或者如果有许多应用程序正在同时运行,那么可能会耗尽系统监视器堆。
SQLP_THRESHOLD_VAL_OF_LRG_LOCKLIST_SZ_FOR_MAX_NON_LOCKS
(当前为 8000),缺省值是
SQLP_DEFAULT_MAX_NON_TABLE_LOCKS_LARGE
(当前为 150)。否则,缺省值为 SQLP_DEFAULT_MAX_NON_TABLE_LOCKS_SMALL
(当前为 0)。如果在启动后更改了值,那么对语句进行的任何新编译都将沿用新的注册表值设置。对于程序包高速缓存中的语句,在重新编译语句之前,不会在删除处理中进行任何更改。SET CURRENT MDC ROLLOUT MODE 语句将在应用程序连接级别覆盖 DB2_MDC_ROLLOUT 的值。
在 DB2 V9.7 及更高版本的发行版中,不支持将 DEFER 值用于具有分区 RID 索引的数据分区 MDC 表。仅支持 OFF 和 IMMEDIATE 值。如果 DB2_MDC_ROLLOUT 注册表变量设置为 DEFER,或者 CURRENT MDC ROLLOUT MODE 专用寄存器设置为 DEFERRED 以覆盖 DB2_MDC_ROLLOUT 设置,那么清除转出类型将为 IMMEDIATE。 如果 MDC 表仅存在非分区 RID 索引,那么支持执行延迟索引清除转出。
DB2MEMDISCLAIM 设置为 YES 会导致较少的调页空间需求,并且可能导致较少的页面调度磁盘活动。DB2MEMDISCLAIM 设置为 NO 将会导致较多的调页空间需求,并且可能导致更多的页面调度磁盘活动。在某些情况下,例如,如果调页空间很大,并且实内存很大从不会发生页面调度,那么设置为 NO 会提供较小的性能提高。
如果未设置 DB2MEMMAXFREE,那么在将内存释放回操作系统之前,DB2 数据库系统进程将保留多达 20% 的未使用专用内存(根据当前消耗的专用内存量)。
如果未设置此变量,那么 DB2 数据库管理器就会根据服务器上的内存量计算 minfree 和 maxfree 的值。除非正在运行自调整内存管理器 (STMM) 并将 database_memory 设置为 AUTOMATIC,否则此变量的设置不起作用。
当这些变量设置为 ON 时,读入至 DB2 缓冲池以及从这些缓冲池中写出的数据将绕过 AIX 内存高速缓存并使用内存映射 I/O。如果 DB2 缓冲池相对较小,并且您无法增大或选择不增大此缓冲池的大小,那么应该通过将 DB2_MMAP_READ 和 DB2_MMAP_WRITE 设置为 OFF 来利用 AIX 内存高速缓存。
当这些变量设置为 ON 时,读入至 DB2 缓冲池以及从这些缓冲池中写出的数据将绕过 AIX 内存高速缓存并使用内存映射 I/O。如果 DB2 缓冲池相对较小,并且您无法增大或选择不增大此缓冲池的大小,那么应该通过将 DB2_MMAP_READ 和 DB2_MMAP_WRITE 设置为 OFF 来利用 AIX 内存高速缓存。
db2set DB2NTMEMSIZE=FCM:1073741824;APLD:268435456
db2set DB2NTMEMSIZE=QUE:67108864
在 Windows 中,在打开文件时对文件进行高速缓存,这是缺省行为。为文件中的每 1 GB 从系统池保留 1 MB。使用此注册表变量来覆盖高速缓存的无正式文件的 192 MB 限制。当达到该高速缓存限制时,给出资源不够错误。
此变量与使用 DB2PRIORITIES 设置的各个线程优先级一起使用,以确定此系统中 DB2 线程相对于其他线程的绝对优先级。
有关更多信息,请参阅 Win32 文档中的 SetPriorityClass() API。
使用 DB2NTWORKSET=min, max 语法来指定 DB2NTWORKSET,其中 min 和 max 以兆字节表示。
还可以使用 <entry>[;<entry>...](其中 <entry>=<buffer pool ID>,<number of pages>)来临时更改所有缓冲池或部分缓冲池的大小,以便它们可以启动。
在 Linux 上,除了要求修改此注册表变量以外,还需要 libcap.so.1 库。
如果将此变量设为 YES,那么将无法启用数据库共享内存自调整功能(通过将 database_memory 配置参数设为 AUTOMATIC 来激活此功能)。
chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE <instance_owner_user_id>
对于 64 位环境中的 HP-UX,除了修改此注册表变量外,还必须对 DB2 实例组授予 MLOCK 特权。为此,具有 root 用户访问权限的用户要执行以下操作:
db2iadm1 MLOCK
setprivgrp -f /etc/privgroup
db2set DB2_RCT_FEATURES=GROUPUPDATE=ON
注意:一旦启用了此注册表变量,就不可能逆向迁移到较低版本的修订包。此外,当使用 DATA CAPTURE CHANGES 的 UPDATE 语句的目标表、触发器和可变长度列具有任何辅助索引,或者更新修改任何主键列或外键列时,将不会执行组更新。
在启用了 AIX NUMA 和 Linux NUMA 的机器上,可以定义指定 DB2 数据库系统使用的资源集的策略。使用资源集绑定时,将每个单独的 DB2 进程与特定资源集绑定。这对于一些性能调整方案很有用。
可以设置该注册表变量来指示指向这样一个配置文件的路径:该配置文件定义用于将 DB2 进程与操作系统资源的策略绑定。资源策略使您可以指定一组操作系统资源来限制 DB2 数据库系统。每个 DB2 进程都与该资源集中的单个资源绑定。资源分配以循环方式进行。
样本配置文件:
示例 1:将所有 DB2 进程与 CPU 1 或 3 绑定。
<RESOURCE_POLICY>
<GLOBAL_RESOURCE_POLICY>
<METHOD>CPU</METHOD>
<RESOURCE_BINDING>
<RESOURCE>1</RESOURCE>
</RESOURCE_BINDING>
<RESOURCE_BINDING>
<RESOURCE>3</RESOURCE>
</RESOURCE_BINDING>
</GLOBAL_RESOURCE_POLICY>
</RESOURCE_POLICY>
示例 2:(仅适用于 AIX)将 DB2 进程与下列其中一个资源集绑定:sys/node.03.00000、sys/node.03.00001、sys/node.03.00002 或 sys/node.03.00003
<RESOURCE_POLICY>
<GLOBAL_RESOURCE_POLICY>
<METHOD>RSET</METHOD>
<RESOURCE_BINDING>
<RESOURCE>sys/node.03.00000</RESOURCE>
</RESOURCE_BINDING>
<RESOURCE_BINDING>
<RESOURCE>sys/node.03.00001</RESOURCE>
</RESOURCE_BINDING>
<RESOURCE_BINDING>
<RESOURCE>sys/node.03.00002</RESOURCE>
</RESOURCE_BINDING>
<RESOURCE_BINDING>
<RESOURCE>sys/node.03.00003</RESOURCE>
</RESOURCE_BINDING>
</GLOBAL_RESOURCE_POLICY>
</RESOURCE_POLICY>
示例 3:(仅适用于 Linux)将与 SAMPLE 数据库相关联的缓冲池标识 2 和 3 的所有内存与 NUMA 节点 3 绑定。并且,将数据库内存总量的 80% 用于与 NUMA 节点 3 绑定,并保留 20% 的内存量分布在所有节点中作为并非特定于缓冲池的内存。
<RESOURCE_POLICY>
<DATABASE_RESOURCE_POLICY>
<DBNAME>sample</DBNAME>
<METHOD>NODEMASK</METHOD>
<RESOURCE_BINDING>
<RESOURCE>3</RESOURCE>
<DBMEM_PERCENTAGE>80</DBMEM_PERCENTAGE>
<BUFFERPOOL_BINDING>
<BUFFERPOOL_ID>2</BUFFERPOOL_ID>
<BUFFERPOOL_ID>3</BUFFERPOOL_ID>
</BUFFERPOOL_BINDING>
</RESOURCE_BINDING>
</DATABASE_RESOURCE_POLICY>
</RESOURCE_POLICY>
示例 4:(仅适用于 Linux 和 Windows)定义两个分别由 CPU 掩码 0x0F 和 0xF0 指定的不同处理器集。将 DB2 进程和缓冲池标识 2 与处理器集 0x0F 绑定,并将 DB2 进程和缓冲池标识 3 与处理器集 0xF0 绑定。对于每个处理器集,将数据库内存总量的 50% 用于绑定。
当期望建立处理器与 NUMA 节点之间的映射时,此资源策略很有用。下面是这种情况的一个示例:一个系统中有 8 个处理器和 2 个 NUMA 节点,其中处理器 0 到 3 属于 NUMA 节点 0,而处理器 4 到 7 属于 NUMA 节点 1。此资源策略允许在进行处理器绑定的同时隐式维护内存的局部性(CPU 方法和 NODEMASK 方法混合使用)。
<RESOURCE_POLICY>
<DATABASE_RESOURCE_POLICY>
<DBNAME>sample</DBNAME>
<METHOD>CPUMASK</METHOD>
<RESOURCE_BINDING>
<RESOURCE>0x0F</RESOURCE>
<DBMEM_PERCENTAGE>50</DBMEM_PERCENTAGE>
<BUFFERPOOL_BINDING>
<BUFFERPOOL_ID>2</BUFFERPOOL_ID>
</BUFFERPOOL_BINDING>
</RESOURCE_BINDING>
<RESOURCE_BINDING>
<RESOURCE>0xF0</RESOURCE>
<DBMEM_PERCENTAGE>50</DBMEM_PERCENTAGE>
<BUFFERPOOL_BINDING>
<BUFFERPOOL_ID>3</BUFFERPOOL_ID>
</BUFFERPOOL_BINDING>
</RESOURCE_BINDING>
</DATABASE_RESOURCE_POLICY>
</RESOURCE_POLICY>
可以使用 DB2NTPRICLASS 注册表变量来为 AIX 上的 DB2 和 Windows 上的 DB2 设置操作系统调度策略。
此外,可以使用注册表变量 DB2PRIORITIES 和 DB2NTPRICLASS 来控制操作系统调度策略和设置 DB2 代理程序优先级。但是,如果在资源策略配置文件中指定 SCHEDULING_POLICY 元素,就可以在单一位置指定调度策略和相关代理程序优先级。
示例 1:选择 AIX SCHED_FIFO 调度策略,并提高 DB2 日志写程序和阅读器进程的优先级。
<RESOURCE_POLICY>
<SCHEDULING_POLICY>
<POLICY_TYPE>SCHED_FIFO</POLICY_TYPE>
<PRIORITY_VALUE>60</PRIORITY_VALUE>
<EDU_PRIORITY>
<EDU_NAME>db2loggr</EDU_NAME>
<PRIORITY_VALUE>56</PRIORITY_VALUE>
</EDU_PRIORITY>
<EDU_PRIORITY>
<EDU_NAME>db2loggw</EDU_NAME>
<PRIORITY_VALUE>56</PRIORITY_VALUE>
</EDU_PRIORITY>
</SCHEDULING_POLICY>
</RESOURCE_POLICY>
示例 2:在 Windows 上替换 DB2NTPRICLASS=H。
<RESOURCE_POLICY>
<SCHEDULING_POLICY>
<POLICY_TYPE>HIGH_PRIORITY_CLASS</POLICY_TYPE>
</SCHEDULING_POLICY>
</RESOURCE_POLICY>
如果通信缓冲区空间不足以容纳查询的整个结果,那么将返回 SQLCODE -906 错误并回滚事务。请分别查看 aslheapsz 和 rqrioblk 数据库管理器配置参数以了解有关调整本地应用程序和远程应用程序的通信缓冲区内存区域大小的信息。
如果启用了分区内并行性,那么此注册表变量不受支持。
如果该值设置为 -1,那么对容器大小没有限制。
只有在“当前已落实”语义对避免锁定争用没有帮助时,DB2_SKIPDELETED 才适用。如果设置了此变量,并且“当前已落实”语义适用于扫描,那么将不会跳过已删除的行;而是,将处理它们的当前已落实版本。
此注册表变量不会影响 DB2 目录表上的游标的行为。
此注册表变量用 db2start 命令激活。
如果正在使用“当前已落实”语义,那么此注册表变量没有任何作用。也就是说,即使将 DB2_SKIPINSERTED 设置为 OFF 并启用“当前已落实”行为,也仍然会跳过未落实的已插入行。
从 DB2 V9.7 FP2 开始,此变量的缺省设置为 -2,这意味着对于其大小小于或等于 1 个扩展数据块 * 容器数的任何溢出的 SMS 临时对象,将没有任何不需要的文件系统访问。超过此大小的临时对象会被截断为 0 个扩展数据块。
当此变量设置为 0 时(在 DB2 V9.7 FP2 之前,这是缺省设置),不会执行特殊阈值处理。但是,一旦不再需要临时表,该文件就会被截断为 0 个扩展数据块。当此变量的值大于 0 时,将维护更大的文件。超过此阈值的对象将被截断为阈值大小。这样可减少每次使用临时表时删除并重新创建文件所造成的一部分系统开销。
如果此变量设置为 -1,那么不会截断该文件,并且允许它无限增长,只不过会受到系统资源的限制。
当 DB2_SORT_AFTER_TQ=NO 时,优化器往往会在发送端排序,而在接收端合并行。
当 DB2_SORT_AFTER_TQ=YES,优化器往往会发送未排序的行,在接收端不合并,而在接收完所有的行之后才在接收端对这些行进行排序。
SQL 工作空间包含执行 SQL 时的分配(以段的形式)。正在为应用程序执行的每个 SQL 语句(静态或动态)都必须在 SQL 工作空间中保留该语句的执行期间所使用的段的唯一副本。在完成该语句的执行后,该段将成为不活动段,并且可以释放与不活动段相关联的内存分配,也可以继续在 SQL 工作空间中高速缓存这些内存分配。当从任何连接再次执行相同 SQL 语句时,将在 SQL 工作空间中查找上次执行该语句时保留的段的高速缓存副本,从而节省与分配和初始化该段的新副本相关联的成本。因此,SQL 工作空间将同时包含活动段(对应于当前执行的 SQL)和当前未在执行的已高速缓存的段。
此注册表变量的值指定允许在 SQL 工作空间中高速缓存的内存分配的百分比。此高速缓存将表示为活动段的内存分配的百分比。例如,值 50 表示 SQL 工作空间包含所有活动段(当前在执行的段)以及最多 50% 的先前执行了高速缓存的段(可以复用这些段)。应该根据您希望 SQL 工作空间中可供复用的多少来调整 DB2_SQLWORKSPACE_CACHE 的设置。例如,增加此变量的大小可以在一定程度上提高 OLTP 工作负载的性能。在另一方面,较高的设置也意味着将增加应用程序共享堆的大小。注意,如果未将 appl_memory 数据库配置参数设置为 AUTOMATIC,那么 SQL 工作空间的大小还会受 appl_memory 的限制,因此 SQL 工作空间可能并不会提供 DB2_SQLWORKSPACE_CACHE 设置所允许的高速缓存量;在这样的情况下,您可能需要考虑增大 appl_memory(或将其设置为 AUTOMATIC)。此注册表变量不是动态的
当启用了此变量时,在绑定不受防护的嵌入式存储过程中包含的 SQL 和 XQuery 语句期间,不会将外部 SQLDA 格式转换为内部 DB2 格式。这将加速处理嵌入式 SQL 和 XQuery 语句。
当启用了此变量时,不受防护的嵌入式存储过程中不支持下列数据类型:
如果遇到了这些数据类型,那么会返回 SQLCODE -804 和 SQLSTATE 07002。
要禁用快速预分配,请将 DB2_USE_FAST_PREALLOCATION 设为 OFF。这可能会提高运行时性能;但是,在某些操作系统上(尤其是 AIX),当在同一表空间中执行大量插入和选择操作时,创建表空间的速度就会降低,并且数据库恢复时间将延长。对此设置进行的任何更改仅适用于表空间文件大小的新增部分或新文件。如果要禁用快速预分配并避免残留先前进行增加或添加时预分配的空间,需要复原该表空间。
通过使用此变量,就可以在提交和收集异步 I/O (AIO) 请求时使用 AIX I/O 完成端口 (IOCP)。此功能用来提高非一致性内存访问 (NUMA) 环境中的性能,这是因为它可以避免进行远程内存访问。