一些 Db2 UDB Filter Factor 的计算

带参数标记的不等于

谓语条件 c1 >= ? 或者 c1 <= ?,filter factor 为:
= { 0.1  if  c o l c a r d ≤ 25 1 5 × c o l c a r d 79  if  c o l c a r d > 25 =\left\{ \begin{array}{l} 0.1 & \text{ if }colcard\le25\\ \frac{1}{5\times\sqrt\frac{colcard}{79}} & \text{ if }colcard>25 \end{array} \right. ={0.15×79colcard 1 if colcard25 if colcard>25
谓语条件 c1 <= ? and c1 >= ? 或者 c1 between ? and ?,filter factor 为:
= { 0.33  if  c o l c a r d ≤ 25 6 100 × c o l c a r d 79  if  c o l c a r d > 25 =\left\{ \begin{array}{l} 0.33 & \text{ if }colcard\le25\\ \frac{6}{100\times\sqrt\frac{colcard}{79}} & \text{ if }colcard>25 \end{array} \right. ={0.33100×79colcard 6 if colcard25 if colcard>25

推理方法

创建一张测试表,并插入若干数据:

create table testn (c1 decimal(24,6))
insert into testn values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)

收集统计信息,并对 c1 字段的 colcard 做“伪造”:

runstats on table testn
UPDATE SYSSTAT.TABLES SET CARD=79 WHERE TABNAME = 'TESTN' AND TABSCHEMA = 'DB2INST1'
UPDATE SYSSTAT.COLUMNS SET COLCARD=79 WHERE COLNAME = 'C1' AND TABNAME = 'TESTN' AND TABSCHEMA = 'DB2INST1'

生成执行计划并打印:

db2 "explain all for select * from testn where c1 < ?"
db2exfmt -d sample -1

观察 c1 < ? 的 filter factor:

		2) Sargable Predicate, 
			Comparison Operator: 		Less Than (<)
			Subquery Input Required: 	No
			Filter Factor: 			0.2

			Predicate Text:
			--------------
			(Q1.C1 < ?)

可以看到是 0.2,以此类推,迭代不同的 colcard 进行“伪造”,就能得到 colcard 和 filter factor 之间的关系,根据每逢 colcard 是 79 的完全平方数倍数就能得到是有理数的 filter factor,从而推出上述公式。

组合列

两列的交集

可以转换成同一维度

例如 c1 <= v2 and c1 >= v1,可以转换成 c1 between v1 and v2,filter factor 为:
  F F ( c 1 ≤ v 2 ) + F F ( c 1 ≥ v 1 ) − F F ( c 1 ≤ v 2 ) ∪ F F ( c 1 ≥ v 1 ) \ FF(c1\le v2)+FF(c1\ge v1)-FF(c1\le v2)\cup FF(c1\ge v1)  FF(c1v2)+FF(c1v1)FF(c1v2)FF(c1v1)

不能转换成同一维度

例如 c1 = v1 and c2 = v2,无法转换成同一纬度,则 filter factor 为:
  max ⁡ ( min ⁡ ( 1 c o l g r o u p c a r d , F F ( c 1 = v 1 ) , F F ( c 2 = v 2 ) ) , F F ( c 1 = v 1 ) × F F ( c 2 = v 2 ) ) \ \max(\min(\frac{1}{colgroupcard},FF(c1=v1),FF(c2=v2)),FF(c1=v1)\times FF(c2=v2))  max(min(colgroupcard1,FF(c1=v1),FF(c2=v2)),FF(c1=v1)×FF(c2=v2))

两列的并集

可以转换成同一维度

例如 c1 <= v2 or c1 >= v1,filter factor 为:
  min ⁡ ( 1 , F F ( c 1 ≤ v 2 ) + F F ( c 1 ≥ v 1 ) ) \ \min(1,FF(c1\le v2)+FF(c1\ge v1))  min(1,FF(c1v2)+FF(c1v1))

不能转换成同一维度

例如 c1 = v1 or c2 = v2,无法转换成同一纬度,则 filter factor 为:
  F F ( c 1 = v 1 ) + F F ( c 2 = v 2 ) − F F ( c 1 = v 1 ) ∩ F F ( c 2 = v 2 ) \ FF(c1=v1)+FF(c2=v2)-FF(c1=v1)\cap FF(c2=v2)  FF(c1=v1)+FF(c2=v2)FF(c1=v1)FF(c2=v2)

组合列的例子

考虑如下 SQL:

select 
  roleid,
  sortid,
  action,
  approve,id 
from 
	klbsuser.km_role_popedom_sort 
where 
	roleid='52fd731c7c533217399567' and action='SeekAdd' and approve='T'

action 正好出现在 Frequency 中,所以 FF(action) = 0.1115
roleid 不在 Frequency 中,减去后平均得到 FF(roleid) = 0.0227293
approve 我们通过 selectivity 加以控制,FF(approve) 取值从0.001到1不等
column group cards=714,所以 FF(CGC) = 0.0014

FF(action)FF(roleid)FF(approve)FF(CGC)FF1*FF2*FF3WINNER
0.11150.022729310.00140.0025343FF1*FF2*FF3
0.11150.02272930.10.00140.0025343FF(CGC)
0.11150.02272930.00150.00140.0000038FF(CGC)
0.11150.02272930.0010.00140.0000025FF(approve)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱峥嵘(朱髯)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值