执行计划(这里我指的是db2exfmt的输出)中,你可能会发现操作TBSCAN或者FETCH中有SPEED指标,有时候它的值是SLOW, 有时候是FAST,下面我给出来两个例子。 文字较多,我直接贴图:
图一:SPEED = SLOW

图二:SPEED = FAST

那么这个SPEED=SLOW/FAST代表什么意思呢?这就是本文要讲的。
这里的SPEED跟扫描共享有关系,要理解它,首先要理解扫描共享。 很幸运,关于扫描共享Db2信息中心有中文翻译版,而且个人感觉翻译的还不错:
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_11.1.0/com.ibm.db2.luw.admin.perf.doc/doc/c0054502.html
为照顾手机读者(我手机Safari一直打不开信息中心,不知道大家遇到过同样问题不?),在这里我把整页搬过来:
扫描共享
扫描共享是指一个扫描利用另一扫描所完成的工作的能力。共享工作的示例包括磁盘页读、磁盘查找、缓冲池内容复用以及解压等等。
工作量繁重的扫描,例如对大型表进行的表扫描或多维集群 (MDC) 块索引扫描,有时适合与其他扫描共享页读。这样的共享扫描可以从表中的任意一点开始,以便利用已包含在缓冲池中的页。当共享扫描到达表的末尾时,它将从开头继续并在到达开始点时完成操作。这称为回绕扫描。图 1显示了表和索引的常规扫描与回绕扫描之间的区别。
图 1. 常规扫描和回绕扫描的概念性视图
缺省情况下,扫描共享功能处于启用状态,是否适合于扫描共享和回绕由 SQL 编译器自动确定。在运行时,合格的扫描可能参与也可能不参与共享或回绕,这取决于编译时未知的因素。
共享的扫描者在共享组中进行管理。这些组尽可能将它们的成员置于一起,以便最大程度地增加共享的好处。如果一个扫描比另一个扫描快,那么页共享的好处可能会消失。在这种情况下,缓冲池中由第一个扫描访问的缓冲池页在共享组中的另一个扫描能够访问它们之前可能会被清除。数据服务器按同一个共享组中两个扫描之间的缓冲池页数测量它们之间的距离。数据服务器还监视扫描速度。如果同一个共享组中两个扫描之间的距离增大到太大,那么它们可能无法共享缓冲池页。为了减少这种情况,可以对较快的扫描进行调速,以允许较慢的扫描在数据页被清除前访问那些页。图 2显示了两个共享集,其中一个用于表,另一个用于块索引。共享集是通过同一种访问机制(例如表扫描或块索引扫描)访问同一个对象(例如一个表)的共享组的集合。对于表扫描而言,页读顺序按页标识递增;对于块索引扫描而言,页读顺序按键值递增。
图 2. 表扫描和块索引扫描共享的共享集
此图还显示了如何在组中复用缓冲池内容。请考虑扫描 C,这是组 1 的第一个扫描。后续扫描(A 和 B)与 C 分组到一起,这是因为它们与 C 接近并有可能复用 C 读入缓冲池的页。
高优先级扫描者从来不会被低优先级扫描者调速,而是移至另一个共享组。高优先级扫描者可能会被放入某个组并由于该组中低优先级扫描者所完成的工作而受益。只要受益持续,它将一直停留在该组中。通过对快速扫描者进行调速或者将其移至更快的共享组(如果该扫描者遇到这样的组),那么数据服务器将调整共享组以确保共享保持最优。
您可以使用 db2pd 命令来查看关于扫描共享的信息。例如,对于单个的共享扫描,db2pd输出将显示扫描速度和扫描调节时间量之类的数据。对于共享组,命令输出将显示组中的扫描数以及该组共享的页数。
在 EXPLAIN_ARGUMENT 表中,有一些新行包含关于表扫描和索引扫描的扫描共享信息(您可以使用db2exfmt 命令来格式化和查看此表的内容)。
您可以使用优化器概要文件来覆盖编译器所作的关于扫描共享的决策(请参阅“访问类型”)。这样的覆盖仅用于存在特殊需求时的情况;例如,如果要求结果集中记录的顺序可重复,但必须避免使用 ORDER BY 子句(这可能将触发排序),那么回绕提示很有用。否则,建议您不要使用这些优化概要文件,除非 DB2® 服务机构要求您进行使用。
通过上面大段的信息,我们知道:要让两个扫描被放在同一扫描共享组,并且至少有一方受益,那么得保证两者距离不过太大,要保证距离不大,就得保证两者的扫描速度差别不大--否则距离越拉越大。
Db2优化器能根据统计信息还有某扫描所处的位置,评估出该扫描是属于快扫描还是慢扫描,比如,该扫描在一个nested loop join的左脚(outer table), 由于每扫描outer table一行,需要访问inner table一次,所以该扫描一般来讲是慢扫描,这里SPEED会被Db2优化器评估为SLOW, 执行时,该扫描可能被和其它慢扫描并且距离合适的扫描放到一组并受益。
关于SPEED=SLOW/FAST,信息中心也有解释,但似乎没有中文版:
https://www.ibm.com/support/knowledgecenter/zh/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0001099.html
SPEED SLOW
FAST"SLOW" indicates that the scan is expected to progress slowly over the table. For example, if the scan is the outer of a nested loop join)."FAST" indicates that the scan is expected to progress with higher speed. This information is used to group scans together for efficient sharing of bufferpool records.
到这里,你应该理解了SPEED的用法了吧?




