通过锁定延迟对未落实的数据进行求值

为了提高并行性,数据库管理器在某些情况下允许将 CS 或 RS 隔离扫描的行锁定延迟,直到已知某一行满足查询的谓词条件为止。

缺省情况下,在表扫描或索引扫描期间执行行级别锁定时,数据库管理器将先锁定每个已被扫描但其落实状态未知的行,然后再确定该行是否满足查询的谓词条件。

为了提高此类扫描的并行性,请启用 DB2_EVALUNCOMMITTED 注册表变量,以便能够对未落实的数据执行谓词求值。 包含未落实的更新的行可能不满足查询条件,但如果将谓词求值延迟到事务完成之后进行,那么该行可能会确实满足该查询的条件。

未落实的已删除行在表扫描期间将被跳过,并且,如果已启用 DB2_SKIPDELETED 注册表变量,那么数据库管理器在索引扫描期间将跳过已删除的键。

DB2_EVALUNCOMMITTED 注册表变量设置在编译时应用于动态 SQL 或 XQuery 语句,而在绑定期间应用于静态 SQL 或 XQuery 语句。 这意味着,即使在运行时启用此注册表变量,除非在绑定时启用 DB2_EVALUNCOMMITTED,否则也不会使用避免锁定策略。 即使在绑定时启用此注册表变量,但在运行时未启用此变量,避免锁定策略也仍然生效。 对于静态 SQL 或 XQuery 语句,如果重新绑定程序包,那么绑定时生效的注册表变量设置就是所应用的设置。 以隐式方式重新绑定静态 SQL 或 XQuery 语句时,将使用 DB2_EVALUNCOMMITTED 注册表变量的当前设置。

对不同存取方案的未落实数据进行求值的适用性

表 1. RID 纯索引访问
谓词 对未落实的数据进行求值
False
SARGable
表 2. 纯数据访问(关系 RID 列表或延迟 RID 列表)
谓词 对未落实的数据进行求值
False
SARGable
表 3. RID 索引和数据访问
谓词 对未落实的数据进行求值
索引 数据 索引访问 数据访问
False False
SARGable False False
SARGable False
SARGable SARGable False
表 4. 块索引和数据访问
谓词 对未落实的数据进行求值
索引 数据 索引访问 数据访问
False False
SARGable False
SARGable False
SARGable SARGable

示例

以下示例对缺省锁定行为与未落实数据求值行为进行比较。 此表是 SAMPLE 数据库中的 ORG 表。
DEPTNUMB DEPTNAME       MANAGER DIVISION   LOCATION     
-------- -------------- ------- ---------- -------------
      10 Head Office        160 Corporate  New York     
      15 New England         50 Eastern    Boston       
      20 Mid Atlantic        10 Eastern    Washington   
      38 South Atlantic      30 Eastern    Atlanta      
      42 Great Lakes        100 Midwest    Chicago      
      51 Plains             140 Midwest    Dallas       
      66 Pacific            270 Western    San Francisco
      84 Mountain           290 Western    Denver
在缺省的游标稳定性 (CS) 隔离级别下,将执行下列事务。
表 5。 在 CS 隔离级别下对 ORG 表执行的事务
会话 1 会话 2
connect to sample connect to sample
+c update org set deptnumb=5 where manager=160  
  select * from org where deptnumb >= 10

会话 1 中未落实的 UPDATE 语句在表中的第一行保留互斥锁定,阻止会话 2 中的查询返回结果集,尽管会话 1 中更新的行当前不满足会话 2 中的查询。 CS 隔离级别指定当光标位于该行上时,必须锁定查询所访问的任何行。 只有在会话 1 释放对第一行的锁定之后,会话 2 才能获取对该行的锁定。

通过使用对未落实的数据进行求值这一功能,可以避免在会话 2 中等待锁定,该功能首先对谓词进行求值,然后再锁定行。 这样,会话 2 中的查询将不会尝试锁定表中的第一行,从而提高了应用程序并行性。 请注意,这也意味着会话 2 中的谓词求值将针对会话 1 中的未落实值 deptnumb=5 进行。 尽管会话 1 中的更新回滚将满足会话 2 中的查询,但会话 2 中的查询将省略其结果集中的第一行。

即使掉转操作顺序,对未落实的数据进行求值这一功能也仍然能够提高并行性。 使用缺省锁定行为时,会话 2 将首先获取行锁定,从而禁止在会话 1 中执行搜索型 UPDATE,即使会话 1 中的 UPDATE 语句不更改被会话 2 的查询锁定的行亦如此。 如果会话 1 中的搜索型 UPDATE 首先尝试检查行,然后仅当这些行符合条件时才将其锁定,那么会话 1 中的查询将不会被阻塞。

限制

  • 必须启用 DB2_EVALUNCOMMITTED 注册表变量。
  • 隔离级别必须是 CS 或 RS。
  • 行级别锁定生效。
  • 存在控制求值谓词。
  • 未落实数据求值功能不适用于对系统目录表执行的扫描。
  • 对于多维集群 (MDC) 或插入时间集群 (ITC) 表,可以对索引扫描延迟块级锁定;但是,不能对表扫描延迟块级锁定。
  • 对于正在执行原位置表重组操作的表,不会发生锁定延迟。
  • 对于索引扫描访存方案而言,不会将行级别锁定延迟到数据访问期间进行;而是,在移至表中的某行之前在索引访问期间锁定该行。
  • 在表扫描期间将无条件地跳过已删除的行,但仅当 DB2_SKIPDELETED 注册表变量处于启用状态时,才会跳过已删除的索引键。