WEB开发网
开发学院数据库DB2 “仅索引” 更新和删除的秘密 阅读

“仅索引” 更新和删除的秘密

 2009-11-16 00:00:00 来源:WEB开发网   
核心提示: 您应该知道 IX4 允许重复并且不是 CLUSTER 索引,索引中的每个条目都有与其关联的一个或多个 RID,“仅索引” 更新和删除的秘密(2),运行时,DB2 将查找索引,每次一个释放 500 个 U 锁,每次一个(当指针离开每个页面而不执行 DELETE 时),找到 TRANDATE 等于

您应该知道 IX4 允许重复并且不是 CLUSTER 索引,索引中的每个条目都有与其关联的一个或多个 RID。运行时,DB2 将查找索引,找到 TRANDATE 等于 SQL 语句中的日期的索引行。假设 DB2 找到 200 个相邻行。这 200 个条目中,每个都具有一个长度可变的 RID 链,一些只有一个 RID;另一些有一个长度在 2 个 RID 到 300 个 RID 之间的 RID 链。对于我们的 TRANDATE,所有限制的 RID 的总数目是 2200。

对于我们的访问路径和 2200 个 RID 中的每一个 RID,DB2 将随机读取 BIG_TABLE(记住,这个索引的 CLUSTERRATIO 非常低)并且有可能执行 2200 次 GET PAGE 和 2200 次读 I/O。因为我们已经为这个表空间选择 LOCKSIZE PAGE,所以预期 DB2 在每个接触的表页上获得一个 X 锁。但是,DB2 不会获得 X 锁,因为在 STATUS 上应用非索引谓词之前,它并不知道是否实际执行 DELETE。DB2 首先在每个页上获得一个 U 锁(用于 UPDATE OF 的 READ 锁)。然后 DB2 在 STATUS 上应用谓词。如果 STATUS 不是 C,U 锁将在内部指针离开表页时被释放(我们在包中绑定了 ISOLATION CS)。如果 STATUS 是 C,U 锁将被升级到 X 锁并一直保持到 COMMIT。

总之,我们将在两个或三个相邻索引页上读取 200 个相邻索引行,并找到 2200 个限制的 RID。DB2 将为每个 RID 读取表。假设 500 行的 STATUS 不是 C。如果 DB2 没有找到完全限制的行,最坏情况下的开销是:

500 次 GET PAGE

500 次读 I/O

获取 500 个 U 锁,每次一个

释放 500 个 U 锁,每次一个(当指针离开每个页面而不执行 DELETE 时)。

如果 DB2 找到完全限制行(其它 1700 行),锁开销是:

1700 次 GET PAGE

1700 次读 I/O

上一页  1 2 3 4  下一页

Tags:索引 更新 删除

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接