配置和管理锁定使用情况

LOCKS 配置参数指定内部锁表的初始大小。如果数据库服务器增大锁表的大小,那么应该增大 LOCKS 配置参数的大小。

有关如何确定 LOCKS 配置参数的初始值的信息,请参阅 LOCKS 配置参数和内存利用率

如果会话所需的锁数超过了在 LOCKS 配置参数中设置的值,那么数据库服务器会尝试使锁表的大小增加一倍。每次锁表溢出时(当所需锁数量大于锁表的当前大小时),数据库服务器就会增加锁表大小,最多可高达 99 次。每次数据库服务器增加锁表的大小时,该服务器都会尝试将锁表大小翻倍。但是,服务器会将每次的实际增加值限制为不超过表 1 中显示的已添加锁的最大值。数据库服务器增加锁表大小满 99 次以后,该服务器将不再增加锁表的大小,这时需要锁的应用程序将收到一条错误消息。

32 位和 64 位平台上允许的最大锁定数

下表显示了允许的最大锁定数。

表 1. 32 位和 64 位平台上的最大锁定数
平台 最大初始锁数 最大动态锁表扩展数 每个锁表扩展添加的最大锁定数 允许的最大锁定数
32 位 8,000,000 99 100,000 8,000,000 + (99 x 100,000)
64 位 500,000,000 99 1,000,000 500,000,000 + (99 x 1,000,000)

查看与锁定表大小增加相关的消息

每次数据库服务器增加锁表的大小时,该服务器将在消息日志文件中放置一条消息。您应该定期监视消息日志文件,如果看到数据库服务器已经增加了锁表大小,那么应增加 LOCK 配置参数的大小。

监视“锁定数不足”错误

要监视应用程序接收到“超过锁定数”错误的次数,请查看 onstat -p 输出中的 ovlock 字段。 您还可以从 sysmaster 数据库中的 sysprofile 表看到类似的信息。以下各列包含相关统计信息。

描述
ovlock 会话尝试超过最大锁定数的次数
lockreqs 会话请求锁定的次数
lockwts 会话等待锁定的次数

检查应用程序如何使用锁定

如果数据库服务器正在使用大量的锁定,那么您可以检查各个应用程序如何使用锁定,如下所示:

  1. 使用 onstat -u 监视会话可查看某个特别的用户是否正在使用大量的锁定(locks 列中的值特别大)。
  2. 如果的确有某个特别用户使用大量锁定,那么检查 应用程序中的 SQL 语句,以确定是应该锁定表,还是应该使用单独的行锁或页锁。

表锁比单独的行锁效率要高,但它降低了并行性。

减少加在表上的锁数的一种方法是,将表由使用行锁改为使用页锁。 然而,页锁 降低了表的整体并行性,这将影响到性能。

您还可以按照互斥方式通过锁定表来减少放置在该表上的锁定数。