扫描共享
扫描共享是指一个扫描利用另一扫描所完成的工作的能力。 共享工作的示例包括磁盘页读、磁盘查找、缓冲池内容复用以及解压等等。
工作量繁重的扫描,例如对大型表进行的表扫描或多维集群 (MDC) 块索引扫描,有时适合与其他扫描共享页读。 这样的共享扫描可以从表中的任意一点开始,以便利用已包含在缓冲池中的页。 当共享扫描到达表的末尾时,它将从开头继续并在到达开始点时完成操作。 这称为回绕扫描。 图 1 显示表和索引的常规扫描和回绕扫描之间的差异。图 1。 常规扫描和回绕扫描的概念性视图

缺省情况下,扫描共享功能处于启用状态,是否适合于扫描共享和回绕由 SQL 编译器自动确定。 在运行时,合格的扫描可能参与也可能不参与共享或回绕,这取决于编译时未知的因素。
共享的扫描者在共享组中进行管理。 这些组尽可能将它们的成员置于一起,以便最大程度地增加共享的好处。 如果一个扫描比另一个扫描快,那么页共享的好处可能会消失。 在这种情况下,缓冲池中由第一个扫描访问的缓冲池页在共享组中的另一个扫描能够访问它们之前可能会被清除。 数据服务器按同一个共享组中两个扫描之间的缓冲池页数测量它们之间的距离。 数据服务器还监视扫描速度。 如果同一个共享组中两个扫描之间的距离增大到太大,那么它们可能无法共享缓冲池页。 为了减少这种情况,可以对较快的扫描进行调速,以允许较慢的扫描在数据页被清除前访问那些页。 图 2 显示了两个共享集,一个用于表,另一个用于块索引。 共享集是通过同一种访问机制(例如表扫描或块索引扫描)访问同一个对象(例如一个表)的共享组的集合。 对于表扫描而言,页读顺序按页标识递增;对于块索引扫描而言,页读顺序按键值递增。图 2。 表扫描和块索引扫描共享的共享集
此图还显示了如何在组中复用缓冲池内容。 请考虑扫描 C ,这是组 1 的前导扫描。 以下扫描 (A 和 B) 与 C 分组在一起,因为它们已接近并且可能复用 C 已引入缓冲池的页面。

高优先级扫描者从来不会被低优先级扫描者调速,而是移至另一个共享组。 高优先级扫描者可能会被放入某个组并由于该组中低优先级扫描者所完成的工作而受益。 只要受益持续,它将一直停留在该组中。 通过对快速扫描者进行调速或者将其移至更快的共享组(如果该扫描者遇到这样的组),那么数据服务器将调整共享组以确保共享保持最优。
您可以使用 db2pd 命令来查看关于扫描共享的信息。 例如,对于单个的共享扫描,db2pd 输出将显示扫描速度和扫描调节时间量之类的数据。 对于共享组,命令输出将显示组中的扫描数以及该组共享的页数。
在 EXPLAIN_ARGUMENT 表中,有一些新行包含关于表扫描和索引扫描的扫描共享信息(您可以使用 db2exfmt 命令来格式化和查看此表的内容)。
您可以使用优化器概要文件来覆盖编译器作出的有关扫描共享的决策 (请参阅 访问类型
)。 这样的覆盖仅用于存在特殊需求时的情况;例如,如果要求结果集中记录的顺序可重复,但必须避免使用
ORDER BY 子句(这可能将触发排序),那么回绕提示很有用。 否则,建议您不要使用这些优化概要文件,除非 Db2® 服务请求这样做。