扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
| COLNAME | COLCARD | HIGH2KEY | LOW2KEY |
| DEPTNUMB | 8 | 66 | 15 |
| MANAGER | 8 | 270 | 30 |
| DEPT | 8 | 66 | 15 |
| ID | 35 | 340 | 20 |
3. 计算基数估计值。
等式连接谓词的过滤因子的估计值计算如下:
1/max(colcard_LHS,colcard_RHS). |
其中 LHS 在连接谓词的左边,RHS 在连接谓词的右边。本例中有以下两个连接谓词:
P1: org.manager=staff.id P2: org.deptnumb=staff.dept |
以及过滤因子(ff),P1 和 P2 计算如下:
ff(P1) = 1 / max (8,35) = 1/35 = 0.0285714 ff(P2) = 1/max(8,8) = 1/8 = 0.125 |
使用过滤因子以及两个表的基数估计值,连接基数计算如下:
JoinCard = Cardinality(ORG) * cardinality(STAFF) * ff(P1) * ff(P2)
= 35 * 8 * 0.0285714 * 0.125
= 1
|
4. 在连接中标识父表。
在表 B.5 中,列统计信息显示 STAFF 是连接的父表,因为符合以下条件:
对于谓词 org.manager=staff.id:
colcard(MANAGER) < colcard(ID) high2key(MANAGER) < high2key(ID) low2key(MANAGER) > low2key(ID) |
因此,这个谓词的父表是 STAFF。
对于谓词 org.deptnumb=staff.dept,colcard、high2key 和 low2key 统计信息是等同的。因此,这个谓词不存在父表,它应被视为“中立”。
5. 在父表中收集列组统计信息。
在步骤 4 中,STAFF 被标识为连接的父表,ORG 被标识为连接的子表,所以应在 STAFF 表的列(ID,DEPT)中收集列组统计信息:
RUNSTATS ON TABLE <SCHEMA_NAME>.STAFF ON ALL COLUMNS AND COLUMNS ((ID,DEPT)); |
使用这两个列的列组统计信息,DB2 优化器就可以准确地估计出基数:
8
TBSCAN
( 2)
33.5658
2
|
8
SORT
( 3)
33.4243
2
|
8
HSJOIN
( 4)
33.0363
2
/-----+-----\
35 8
TBSCAN TBSCAN
( 5) ( 6)
17.2334 15.3736
1 1
| |
35 8
TABLE: SKAPOOR TABLE: SKAPOOR
STAFF ORG
|
示例 B.6 中立连接
考虑 T1 和 T2 这两个表的连接,使用以下谓词:
P1: T1.C1 = T2.C1 P2: T1.C2 = T2.C2 P3: T1.C3 = T2.C3 |
假设这两个表具有以下的统计信息:
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。