管理器就会对该应用程序挂起的锁定执行从行到表的锁定升级。虽然升级过程本身花不了多少时间,但是锁定整个表(与个别行比较)降低了并发性,并且可能因对受影响的表进行后续访问而降低整个数据库性能。关于如何控制锁定列表大小的建议是:
•经常执行 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中所示的排序列表