【性能优化】6.6 [外键关联] 对位序列

 

【性能优化】6.5 [外键关联] 索引复用

6.6 对位序列

对于已经序号化的外键,我们还可以使用对位序列来处理维表上的过滤。


A

1

=file("product.btx").import@b()

2

=file("orders_new.btx").cursor@b(p_id,quantity)

3

=A1.(state=="CA")

4

=A2.select(A3(p_id))

5

=A4.groups(A1(p_id).vendor;sum(p_id.price*quantity))

A3 会产生一个与维表 A1 同样长度的序列,其成员都是布尔值,满足条件的维表记录对应 true,否则对应 false。然后在 A4 中只要用已经序号化的主键取出这个对位序列的成员,就能判断出该维表记录是否已经被过滤,从而快速决定是否把事实表记录也过滤掉。

因为不需要做实质性的查找,对位序列的性能非常好,在处理维表过滤时很有效。

对于组表,在游标前过滤就会更有优势:


A

1

=file("product.btx").import@b()

2

=A1.(state=="CA")

3

=file("orders_new.ctx").cursor(p_id,quantity;A2(p_id))

4

=A4.groups(A1(p_id).vendor;sum(p_id.price*quantity))

没有序号化的外键,也可以变相地使用对位序列来做过滤:


A

1

=file("product.btx").import@b().keys@i(id)

2

=file("orders.btx").cursor@b(p_id,quantity)

3

=A1.(state=="CA")

4

=A2.run(p_id=A1.pfind(p_id))).select(  A3(p_id) )

5

=A4.groups(A1(p_id).vendor;sum(p_id.price*quantity))

这个运算仅仅比无过滤时多了用序号取成员的动作,性能相差不大。

【性能优化】6.7 [外键关联] 大维表查找
【性能优化】 前言及目录