我具有以下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子句)
查询执行正常,但花费的时间稍长。是否有更好的方法为上述要求编写查询代码?
非常感谢任何投入
答案 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(可能具有稀疏索引)
如果无法收集统计信息,请使用计划表结果更新问题。