DB2将大型物理表与小型全局临时表连接起来

时间:2019-02-06 06:26:21

标签: db2 mainframe db2-zos

我具有以下3个表联接的要求

a) Table T1 - large physical table with 100 Million rows
   Index columns: C1, C2, C3 in this order
b) Table T2 - Temp table with 50 records
   contains C2 & additional columns. No Index
c) Table T3 - Temp table with 100 records
   contains C3 & additional columns. No Index

表T2和T3没有公共列

我试图从T1,T2,T3提取数据,如下所示:

Select T1.*, T2.*, T3.* 
from T1 
Inner join T2 (on T1.C2 = T2.C2) 
Inner join T3 (T1.C3 = T3.C3)
where 
T1.C1 = a constant value (coming from my program).

上述查询的解释表明,在T1上,仅使用1列执行索引扫描。 (我相信它是T1.C3,因为我提供了WHERE子句)

查询执行正常,但花费的时间稍长。是否有更好的方法为上述要求编写查询代码?

非常感谢任何投入

1 个答案:

答案 0 :(得分:0)

您提到您正在使用临时表。您是否在临时表上运行RUNSTATS, 包括 收集列统计信息?

在某一列上进行索引扫描匹配必须与在第1列上进行T1匹配相对,因为那是索引的前导列。在检查说明时,您还应该注意PRIMARY_ACCESSTYPE。 Db2可以选择扫描T1,T2和T3之一或全部并创建稀疏索引,该索引将在PLAN_TABLE中以PRIMARY_ACCESSTYPE = T反映出来。

1亿行表的3列索引的基数是什么?它独特吗?它是否具有高度选择性-接近1亿行的表大小,还是有意义的重复行适合每个探针?

在这种情况下,准确的统计数据很重要。笛卡尔连接的成本很高,因此,重要的一点是Db2了解临时表有多小,以及连接列在考虑选择访问路径时的选择性。如果未在表T2和T3上收集任何统计信息,则defauls的Db2假定表中有10,000行。然后,将T2和T3的笛卡尔联接估计为10,000 * 10,000行= 1亿,那么Db2仅使用本地过滤器访问该表一次便有意义,然后联接到T2和T3(可能具有稀疏索引)

如果无法收集统计信息,请使用计划表结果更新问题。