IBM 的DB2 V9 引入了自动自调整内存管理 , 自适应的自调整内存功能通过自动设置内存配置参数值以及调整缓冲池大小来简化内存配置任务。启用此功能后,内存调整器就会在几个内存使用者(包括:排序、 程序包高速缓存、锁定列表和缓冲池)之间动态地分配可用内存资源,从而简化了内存配置参数调整的工作量。本文重点介绍在DB2® V9中如何使用自动自调整内存,包括如何启用自调整内存,禁用自调整内存以及自调整内存相关的几个内存配置参数等。
简介
在DB2 V9之前,数据库 的 内存配置参数和缓冲池都是由管理员手工设置的。而数据库的工作负载很少是静态的,而是动态变化的。比如,当工作负载类型发生变化(由事务型变成了混合型 等)、用户增加、维护任务的运行或者其它应用程序消耗的资源变化等,都会造成工作负载在不停的变化。因此,即便是资深的数据库管理员调优过的系统,在另一 个时候也未必是最优的。数据库管理员需要根据变化随时做出调整,工作量大而效果也不明显。变化可能在很短的时间内发生,因此留给数据库管理员作出响应的时 间很短。数据库内存设置尤其容易受这些变化的影响,因而会严重影响响应时间。
现在,从IBM® DB2®版本 9 开始,新的内存调整功能自动设置若干内存配置参数值,从而简化了内存配置任务。启用此功能后,内存调整器就会在几个内存使用者(包括排序、程序包高速缓 存、锁定列表和缓冲池)之间动态地分配可用内存资源。内存调整器对工作负载特征的显著更改作出响应,从而调整内存配置参数值和缓冲池大小以优化性能。
本文重点介绍在DB2® V9中如何使用自动自调整内存。
我们将按照下列顺序介绍自动自调整内存:
•自动自调整内存概述
•启用自动自调整内存
•与自调整相关的内存管理参数
•禁用自动自调整内存
自动自调整内存概述
DB2 V9的自动自调整内存功能能够简化若干个内存配置参数的调整。除了简化内存配置任务之外,此新增的自适应的自调整内存功能通过提供更高的配置来提高性能, 该配置可以动态响应工作负载特征中出现的重要变化。自调整内存管理器使用智能控制和反馈机制来跟踪工作负载特征、内存消耗以及对数据库中各种共享资源的需 求的变化,并根据需要动态调整它们对内存的使用。例如,如果排序操作需要更多的内存,而一些缓冲池又有多余的内存,那么内存管理器会释放多余的缓冲池内 存,并将它分配给排序堆。
缺省情况下,已对单一分区数据库启用自调整内存功能,并对多分区数据库禁用此功能。也就是说,在 V9.1 中创建单一分区数据库时,self_tuning_mem 数据库配置参数会自动设置为 ON,如果不需要启用自调整内存管理器,则可在创建数据库之后通过将 self_tuning_mem 配置参数设置为 OFF 来关闭该管理器;在 DPF 系统上不会默认启用自调整内存管理器。
在 Windows® 和 AIX® 平台上(也仅在这两个平台上),自调整内存功能还可确定数据库内存的总需求,并会动态地对数据库共享内存的总体使用情况进行调整。这使数据库管理器可以根 据工作负载的需要消耗更多物理内存,而在数据库内存需求降低时将这些内存释放到操作系统中。
另外,如果将数据库从 V8 迁移至 V9.1,则不会自动启用此功能。要在已迁移的数据库中使用此功能,必须手工启用它。可以通过将 self_tuning_mem 配置参数设置为 ON 并将下列某些或全部配置参数设置为 AUTOMATIC 来启用自调整内存:
•pckcachesz
•locklist 和maxlocks
•sortheap 和sheapthres_shr
•database_memory(其 AUTOMATIC 设置仅在 AIX® 和 Windows® 操作系统上受支持。在其他平台上,database_memory 的缺省值是 COMPUTED)。
自适应的自调整内存功能通过自动设置内存配置参数值以及调整缓冲池大小来简化内存配置任务。启用此功能后,内存调整器就会在几个内存使用者(包括:排序、程序包高速缓存、锁定列表和缓冲池)之间动态地分配可用内存资源。
可以对下列内存使用者启用自调整(把相应的参数设置为 AUTOMATIC):
•缓冲池(由 ALTER BUFFERPOOL 和 CREATE BUFFERPOOL 语句指定AUTOMATIC属性)。
•程序包高速缓存(由 pckcachesz 配置参数控制)。
•锁定内存(由 locklist 和 maxlocks 配置参数控制)。
•排序内存(由 sheapthres_shr 和 sortheap 配置参数控制)。
•数据库共享内存(由 database_memory 配置参数控制)。
接下来我们通过具体的例子来看一下如何使用自动自调整内存。
启用自调整内存功能
首先我们创建一个单一分区数据库MYDB1,由于默认情况下,单一分区数据库启用自调整内存功能,所以我们创建的示例数据库MYDB1就启动了自动自调整 内存功能,其数据库参数self_tuning_mem被自动设置成了ON,并把程序包高速缓存、锁定内存、排序内存和数据库共享内存等内存使用者默认启 动了自动自调整内存功能,默认创建的缓冲池IBMDEFAULTBP也启用了自调整内存功能。我们在DB2CMD窗口中,发出CREATE DB 命令,创建示例数据库MYDB1具体如清单1所示:
<!---->--清单 1. 创建启用自动自调整内存的示例数据库MYDB1C:\>DB2 CREATE DATABASE MYDB1 DB20000I CREATE DATABASE命令成功完成。
我们通过GET DB CFG命令查看示例数据库MYDB1的配置参数,会发现其自调整内存参数(self_tuning_mem)被设置成了ON,数据库共享内存大小 (DATABASE_MEMORY) 、 锁定列表的最大存储量参数(LOCKLIST)、 每个应用程序的锁定百分比列表参数(MAXLOCKS)、 程序包高速缓存大小参数(PCKCACHESZ)、 共享排序的排序堆域值参数(SHEAPTHRES_SHR)和 排序列表堆参数(SORTHEAP)都被设置成了AUTOMATIC,表示这些参数启用自动自调整内存,另外数据库内存阈值参数 (DB_MEM_THRESH)被设置成了10。
DB2 V9中新增了数据库配置参数 db_mem_thresh,以控制有多少物理 RAM 被 database_memory 参数的未使用部分占用。此数据库配置参数指定数据库管理器如何处理未用数据库共享内存过多这一问题。通常,当进程访问内存页时,内存页处于已落实状态,这 表示操作系统已分配了该内存页,并且该内存页占用物理内存空间或磁盘上的页文件空间。根据数据库的工作负载,数据库共享内存需求在一天中的某些时间可能会 达到峰值。一旦操作系统有足够的已落实内存来满足那些峰值需求后,该内存就会一直处于已落实状态,即使内存需求从峰值回落亦如此。此数据库配置参数表示数 据库管理器允许的已落实但当前未使用的数据库共享内存最大百分比,达到此百分比后,数据库管理器将开始释放已落实的内存页以将它们返回给操作系统。可接受 的值是整数 0(立即释放任何未使用的数据库共享内存)到 100(永远不释放任何未使用的数据库共享内存)。缺省值是 10(仅当当前未使用的数据库共享内存超过 10% 时,才释放那些内存)。
具体情况如清单2所示:
--清单 2. 查看示例数据库MYDB1配置参数C:\>DB2 GET DB CFG FOR MYDB1 数据库 MYDB1 的数据库配置 数据库配置发行版级别 = 0x0b00 数据库发行版级别 = 0x0b00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区代码 = 86 数据库整理顺序 = UNIQUE 备用整理顺序 (ALT_COLLATE) = 数据库页大小 = 4096 ....... 自调整内存 (SELF_TUNING_MEM) = ON 数据库共享内存大小(4KB) (DATABASE_MEMORY) = AUTOMATIC 数据库内存阈值 (DB_MEM_THRESH) = 10 锁定列表的最大存储量(4KB) (LOCKLIST) = AUTOMATIC 每个应用程序的锁定百分比列表 (MAXLOCKS) = AUTOMATIC 程序包高速缓存大小(4KB) (PCKCACHESZ) = AUTOMATIC 共享排序的排序堆域值(4KB) (SHEAPTHRES_SHR) = AUTOMATIC 排序列表堆(4KB) (SORTHEAP) = AUTOMATIC ........<!---->
清单2中所示的程序包高速缓存大小(PCKCACHESZ)参数,是在数据库共享内存之外分配的,并且用于高速缓存数据库上的静态和动态 SQL 和 XQuery 语句的部分。高速缓存程序包使数据库管理器在重新装入程序包时可以不访问系统目录;或者对于动态 SQL 或 XQuery 语句,可以免去编译这一步,从而减少其内部开销。将这些段保存在程序包高速缓存中,直到发生下列其中一种情况:
•数据库关闭 。
•程序包或动态 SQL 或 XQuery 语句无效 。
•高速缓存空间用完。
静态或动态 SQL 或 XQuery 语句节的高速缓存可提供性能,尤其是在与数据库连接的应用程序多次使用同一个语句时。这在事务处理应用程序中特别重要。当此参数设置为 AUTOMATIC 时,就启用了自调整功能。当 self_tuning_mem 设置为 ON 时,内存调整器将在工作负载需求更改时动态调整 pckcachesz 控制的内存区的大小。由于内存调整器在不同内存使用者之间交换内存资源,所以,必须至少有两个内存使用者启用自调整功能才能使自调整功能有效。需要注意的 是,程序包高速缓存是工作高速缓存,所以不能将此参数设置为零。此高速缓存中必须分配有足够的内存以保存当前执行的 SQL 或 XQuery 语句的所有节。如果分配的空间比当前需要的空间多,则各节被高速缓存。下一次需要这些部分时,只需执行它们而不必将其装入或进行编译。由 pckcachese 参数指定的限制是软限制。如果数据库共享集合中还有可用的内存,如果有必要的话,可以超过该限制。
清单2中所示的锁定列表的最大存储量 (LOCKLIST)参数,是用来指示分配给锁定列表的内存量。每个数据库有一个锁定列表,锁定列表包含由同时连接至数据库的所有应用程序挂起的锁定。锁 定是数据库管理器用来控制多个应用程序并发访问数据库中的数据的机制。行和表都可以锁定。数据库管理器还可以获取锁定来供内部使用。当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。由于内存调整器在不同内存使用者之间交换内存资源,所 以,必须至少有两个内存使用者启用自调整功能才能使自调整功能有效。locklist 值是与 maxlocks 参数一起调整的,因此,如果禁用 locklist 参数自调整功能,也将自动禁用 maxlocks 参数自调整功能。如果启用 locklist 参数自调整功能,也将自动启用 maxlocks 参数自调整功能。当一个应用程序使用的锁定列表百分比达到 maxlocks 时,数据库管理器就会对该应用程序挂起的锁定执行从行到表的锁定升级。虽然升级过程本身花不了多少时间,但是锁定整个表(与个别行比较)降低了并发性,并 且可能因对受影响的表进行后续访问而降低整个数据库性能。关于如何控制锁定列表大小的建议是:
•经常执行 COMMIT 以释放锁定。
•当执行很多更新时,在更新前锁定整个表(使用 SQL LOCK TABLE 语句)。这样将只使用一个锁定,防止其他锁定干扰更新,但却降低了数据的并发性。
•还可以使用 ALTER TABLE 语句的 LOCKSIZE 选项来控制如何对特定表进行锁定。
•使用“可重复读”隔离级别可能会导致自动表锁定。
只要有可能,使用“游标稳定性”隔离级别以减少所挂起的共享锁定数。如果不会影响到应用程序的完整性需求,则使用“未落实的读”代替“游标稳定性”以进一 步减少锁定量。 将 locklist 设置为 AUTOMATIC。锁定列表将同步地增大以避免发生锁定升级或锁定列表满的情况。 一旦锁定列表已满,性能就可能会降低,因为锁定升级将生成更多的表锁定和更少的行锁定,从而降低数据库中共享对象的并发性。另外,应用程序间可能有更多的 死锁(因为这些应用程序都在等待有限数目的表锁定),这样将导致事务回滚。当数据库的锁定请求数达到最大值时,应用程序将接收到值为 -912 的 SQLCODE。
清单2中所示的每个应用程序的锁定百分比列表(MAXLOCKS)参数,是用来定义应用程序所挂起的锁定列表的百分比,和locklist一起决定了每个 应用程序可以使用的锁定数量,超过了将引发锁升级。当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。由于内存调整器在不同内存使用者之间交换内存资源,所 以,必须至少有两个内存使用者启用自调整功能才能使自调整功能有效。
清单2中所示的共享排序的排序堆域值 (SHEAPTHRES_SHR)参数,是表示对排序内存使用者每次可使用的数据库共享内存总量的软限制。除排序以外,还有其他排序内存使用者(例如,散 列连接、索引 AND 运算、块索引 AND 运算、合并连接和内存表)。当共享排序内存使用者的共享内存总量达到 sheapthres_shr 限制时,就会激活内存调节机制,将来的共享排序内存使用者请求得到的内存量将少于请求的内存量,但始终多于完成任务所需的最低内存量。一旦达到 sheapthres_shr 限制,排序内存使用者的所有共享排序内存请求都将获得完成任务所必需的最低内存量。当活动共享排序内存使用者的共享内存总量达到此限制时,后续排序可能会 失败(SQL0955C)。当数据库管理器配置参数 sheapthres 值为 0 时,数据库的所有排序内存使用者都将使用 sheapthres_shr 控制的数据库共享内存,而不是使用专用排序内存。当 sheapthres_shr 设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。由于内存调整器在不同内存使用者之间交换内存资源,所 以,必须至少有两个内存使用者启用自调整功能才能使自调整功能有效。内存使用者包括 SHEAPTHRES_SHR、PCKCACHESZ、BUFFER POOL(每个缓冲池计数为一个)、LOCKLIST 和 DATABASE_MEMORY。仅当数据库管理器配置参数 sheapthres 设置为 0 时,才允许自动调整 sheapthres_shr。sortheap 值是与 sheapthres_shr 参数一起调整的,因此,如果禁用 sortheap 参数自调整功能,也将自动禁用 sheapthres_shr 参数自调整功能。如果启用 sheapthres_shr 参数自调整功能,也将自动启用 sortheap 参数自调整功能。
清单2中所示的排序列表堆(SORTHEAP) 参数,是定义要用于专用排序的专用内存页的最大数目或要用于共享排序的共享内存页的最大数目。当排序完成时,如果排序为专用排序,那么此参数将影响代理程 序专用内存。如果排序为共享排序,那么此参数将影响数据库共享内存。每个排序都有一个独立的排序堆,该排序堆由数据库管理器根据需要分配。此排序堆是将数 据排序的区域。如果由优化器定向,那么将使用优化器提供的信息分配一个比此参数指定的排序堆小的排序堆。当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。当使用排序堆时,应该考虑下列事项:
•适当的索引可使排序堆的使用减至最小程度。
•散列连接缓冲区、块索引 AND 运算、合并连接、内存中的表以及动态位映射(用于索引 AND 运算和星型连接)使用排序堆内存。在使用这些技术时,增大此参数的大小。
•当需要进行频繁的大型排序时,增大此参数的大小。
•当增大此参数的值时,应该检查是否还需要调整数据库管理器配置文件中的 sheapthres 和 sheapthres_shr 参数。
•排序堆大小由优化器在确定访问路径时使用。在更改此参数后,应考虑重新绑定应用程序(使用 REBIND 命令)。
清单2中所示的数据库共享内存大小 (DATABASE_MEMORY)参数,是用来设置对每个数据库将使用的内存量的限制。在 DB2® V9.1 中,database_memory 配置参数的 COMPUTED 设置等价于 DB2 UDB V8 AUTOMATIC 设置。如果要保留 DB2 V8 行为,则将 database_memory 参数设置为 COMPUTED。在 DB2 V9.1 中,将 database_memory 参数设置为 AUTOMATIC 会启用新增的自调整内存管理功能部件,它可自动调整数据库内存使用。调整器在 database_memory 配置参数定义的内存限制范围内工作。在 Windows® 和 AIX® 上,database_memory 值本身可以自动调整。database_memory 启用自调整(设置为 AUTOMATIC)后,调整器确定数据库的整体内存需求并根据当前数据库需求增大或减小分配给数据库共享内存的内存量。例如,如果当前数据库需求很高, 并且系统上有足够的可用内存,则数据库共享内存将消耗较多的内存。当数据库内存需求下降时,或者当系统上的可用内存量降至过低水平时,就会释放一些数据库 共享内存。database_memory 参数未启用自调整(未设置为 AUTOMATIC)时,整个数据库都将使用指定的内存量,从而根据需要在数据库内存使用者之间分配内存。database_memory 未启用自调整时,可以通过两种方法指定数据库使用的内存量:将 database_memory 设置为数值或者将其设置为 COMPUTED。在第二种情况下,总内存量是根据数据库启动时的数据库内存堆初始值总计而计算的。一定要注意:database_memory 的 AUTOMATIC 设置仅在 AIX® 和 Windows® 操作系统上受支持。在其他平台上,database_memory 的缺省值是 COMPUTED。
接下来我们查看一下默认创建的4K页缓冲池IBMDEFAULTBP的自调整设置,具体如清单3所示:
<!---->--清单 3. 查看默认创建的4K页缓冲池IBMDEFAULTBP的自调整设置C:\>db2 connect to mydb1 数据库连接信息 数据库服务器 = DB2/NT 9.1.0 SQL 授权标识 = RHETTE 本地数据库别名 = MYDB1 C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools" BPNAME NPAGES ------------------------------------------------ ----------- IBMDEFAULTBP -2 1 条记录已选择。
当缓冲池启用了自调整功能时,该特定缓冲池的 sysibm.sysbufferpools 表中的 NPAGES 字段将设置为 -2。当自调整功能处于禁用状态时,NPAGES 字段将设置为缓冲池的当前大小。我们可以在清单2中看到,IBMDEFAULTBP的NPAGES 字段将设置为 -2,由此我们可以确定,IBMDEFAULTBP启用了自调整功能。
下面我们创建示例缓冲池MYBP1,其使用自调整功能(注意其create bufferpool语句使用了automatic),初始大小为400K,具体如清单4所示:
--清单 4. 创建使用自动自调整功能的示例缓冲池MYBP1C:\>db2 create bufferpool mybp1 immediate size 100 automatic pagesize 4k DB20000I SQL命令成功完成。<!---->
接下来创建示例缓冲池MYBP2,其不使用自调整功能,,初始大小为400K,具体如清单5所示:
<!---->--清单 5. 创建不使用自动自调整功能的示例缓冲池MYBP2C:\>db2 create bufferpool mybp2 immediate size 100 pagesize 4k DB20000I SQL命令成功完成。
此时我们通过访问sysibm.sysbufferpools可以看到mybp1的NPAGES字段设置成了-2,而mybp2的NPAGES字段都设置成了100,具体如清单6所示:
<!---->--清单 6. 查看缓冲池C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools" BPNAME NPAGES ------------------------------------------------ ----------- IBMDEFAULTBP -2 MYBP1 -2 MYBP2 100 3 条记录已选择。
现在我们将mybp2改成使用自调整功能,在DB2CMD环境中,执行ALTER BUFFERPOOL命令,具体如清单7所示:
<!---->--清单 7. 修改示例缓冲池MYBP2,使其启用自调整功能C:\>db2 alter bufferpool mybp2 immediate size 100 automatic DB20000I SQL命令成功完成。
再次通过访问sysibm.sysbufferpools可以看到mybp1和mybp2的NPAGES字段都设置成了-2,具体如清单8所示:
<!---->--清单 8. 查看缓冲池C:\>db2 "select BPNAME, NPAGES from sysibm.sysbufferpools" BPNAME NPAGES ------------------------------------------------ ----------- IBMDEFAULTBP -2 MYBP1 -2 MYBP2 -2 3 条记录已选择。
如果数据库是从V8迁移过来,或者被手工设置过禁止使用自调整内存功能,又想重新使用自动自调整内存功能,可以按如下步骤进行操作:
• 通过将 self_tuning_mem 设置为 ON 来对数据库启用自调整功能。可以使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通过控制中心中的更改数据库配置参数窗口来将 self_tuning_mem 设置为 ON。
•要对由内存配置参数控制的内存区域启用自调整功能,请使用 UPDATE DATABASE CONFIGURATION 命令、SQLFUPD API 或通过控制中心中的更改数据库配置参数窗口将相关配置参数设置为 AUTOMATIC。
• 要对缓冲池启用自调整功能,请将缓冲池大小设置为 AUTOMATIC。可以使用 ALTER BUFFER POOL 语句(对于现有缓冲池)或 CREATE BUFFER POOL 语句(对于新缓冲池)来完成此操作。如果在 DPF 环境中将缓冲池大小设置为 AUTOMATIC,就不应该在 sysibm.sysbufferpoolnodes 中为该缓冲池定义任何条目。
需要注意:
• 由于自调整功能在不同内存区域之间重新分配内存,所以,必须至少启用两个内存区域(例如锁定内存区域和数据库共享内存区域)才能使自调整功能起作用。唯一 的例外是由 sortheap 配置参数控制的内存。当仅将 sortheap 设置为 AUTOMATIC 时,将启用 sortheap 的自调整功能。
•要为自调整功能启用 locklist 配置参数,还必须为自调整功能启用 maxlocks,因此当 locklist 设置为 AUTOMATIC 时,maxlocks 也设置为 AUTOMATIC。要为自调整功能启用 sheapthres_shr 配置参数,还必须为自调整功能启用 sortheap,因此当 sheapthres_shr 设置为 AUTOMATIC 时,sortheap 也设置为 AUTOMATIC。
•仅当数据库管理器配置参数 sheapthres 设置为 0 时,才允许自动调整 sheapthres_shr 或 sortheap。
• 自调整内存功能仅在 HADR 主服务器上运行。在 HARD 系统上激活自调整内存功能后,永远不会在辅助服务器上运行此功能,并且,仅当正确地设置配置后,此功能才会在主服务器上运行。如果运行了切换 HADR 数据库角色的命令,自调整内存操作也会切换,从而在新的主服务器上运行。
禁用自动自调整内存
对启用自动自调整内存的数据库,可以通过将将 self_tuning_mem 设置为 OFF 来对整个数据库禁用自调整功能。当 self_tuning_mem 设置为 OFF 时,设置为 AUTOMATIC 的内存配置参数和缓冲池仍为 AUTOMATIC,并且内存区保持其当前大小不变。
接下来我们对示例数据库MYDB1禁用自动自调整内存,使用UPDATE DB CFG命令先把self_tuning_mem设置成OFF,具体如清单9所示:
<!---->--清单 9. 禁用自动自调整内存C:\>db2 update db cfg using self_tuning_mem off DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
我们在上面启动自调整内存的时候讲过,由于自调整功能在不同内存区域之间重新分配内存,所以,必须至少启用两个内存区域(例如锁定内存区域和数据库共享内 存区域)才能使自调整功能起作用。唯一的例外是由 sortheap 配置参数控制的内存。当仅将 sortheap 设置为 AUTOMATIC 时,将启用 sortheap 的自调整功能。 所以,如果只有一个内存使用者启用了自调整功能(sortheap除外),则还可以有效地对整个数据库取消激活自调整功能,这个时候虽然 self_tuning_mem参数被设置成ON,但整个数据库还是取消激活自调整功能。这是因为,当仅启用了一个内存区时,不能对内存进行再分布。
当相互关联的内存配置参数,比如locklist和maxlocks,当一个被禁止使用自调整功能,则另一个也将被停止自调整功能。我们对locklist禁用自调整功能,如清单10所示:
<!---->--清单 10. 对locklist禁用自动自调整内存功能C:\>db2 update db cfg using locklist manual SQL5146W 当 "LOCKLIST" 为 "MANUAL" 时,必须将 "MAXLOCKS" 设置为 "MANUAL"。"MAXLOCKS" 已设置为 "MANUAL"。
如清单10所示,当把locklist禁用自调整功能后,maxlocks也被禁止使用自调整功能。把locklist设置成manual的意思是指对 locklist禁用自调整功能,而locklist的当前值(动态调整的参数,在一段时间内是动态的,但在某一个时点,其是静态的,都有一个当前值)保 持不变。把maxlocks设置成manual也是同样的意思,就是对maxlocks禁用自调整功能,而maxlocks的当前值也保持不变。此时我们 用get db cfg show detail的方式查看数据库配置参数,可以发现locklist和maxlocks的值都被改成固定的值了,具体如清单11所示:
如果要禁用sortheap自调整功能,并同时将sortheap的当前值更改为1000的话,可以如清单12所示进行修改:
<!---->--清单 12. 对sortheap禁用自调整功能C:\>db2 update db cfg using sortheap 1000 SHEAPTHRES_SHR 260 SQL5155W 成功完成更新。SORTHEAP 的当前值可能对性能产生负面影响。
对其他的内存配置参数也禁用自调整功能,具体如清单13所示:
<!---->--清单 13. 对DATABASE_MEMORY、PCKCACHESZ禁用自调整功能C:\>db2 update db cfg using DATABASE_MEMORY manual DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。 C:\>db2 update db cfg using PCKCACHESZ manual DB20000I UPDATE DATABASE CONFIGURATION命令成功完成。
对缓冲池禁用自调整功能,可以通过将缓冲池的大小设成-1或固定值的方式,该缓冲池的 NPAGES 值为 -1 时,DB2 数据库配置参数 BUFFPAGE 控制着缓冲池的大小。当值为-2的时候,代表启用自调整功能(真正有效需要两个方面的因素,第一,需要self_tuning_mem参数设置为ON,第 二,至少还存在一个别的内存区域,比如DATABASE_MEMORY)。具体如清单14所示:
<!---->--清单 14. 对缓冲池禁用自调整功能C:\>db2 alter bufferpool mybp1 size 100 DB20000I SQL命令成功完成。 C:\>db2 alter bufferpool mybp2 size 100 DB20000I SQL命令成功完成。 C:\>db2 alter bufferpool ibmdefaultbp size 100 DB20000I SQL命令成功完成。
此时我们通过访问sysibm.sysbufferpools可以看到mybp1、mybp2和ibmdefaultbp的NPAGES字段都设置成了100了,具体如清单15所示:
<!---->--清单 15. 查看缓冲池BPNAME NPAGES ---------------------------- ----------- IBMDEFAULTBP 100 MYBP1 100 MYBP2 100 3 条记录已选择。
以上,我们对自调整内存进行了详细的介绍,不过,自调整内存也存在着局限性,在少量内存可用的情况下(例如,因为 database_memory 的值设置得很小,或者因为多个数据库、实例或其他应用程序正在服务器上运行),自调整内存带来的性能好处将有限。
因为自调整内存根据数据库工作负载作出调整决定,所以内存特征不断变化的工作负载将限制自调整内存的能力以有效地进行调整。如果工作负载的内存特征不断变 化,则自调整内存调整内存的频率将会降低,并且将重复调整以改变目标条件。在这种情况下,自调整内存将无法获得绝对汇合,而是尝试维护调整为当前工作负载 的内存配置。