【性能优化】6.7 [外键关联] 对位序列
6.7 对位序列
对于已经序号化的外键,我们还可以使用对位序列来处理维表上的过滤。
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)) |
这个运算仅仅比无过滤时多了用序号取成员的动作,性能相差不大。