基于行级特定时间范围关联两张订单表(KDB+/Q)
KDB+/Q订单交叉匹配方案对比与实现
方案效率对比
- 逐行遍历方案:将t1拆成行列表逐行查询t2,本质是循环执行单条查询,数据量越大性能越差——每次查询都要全量扫描t2,时间复杂度为O(N*M)(N为t1行数,M为t2行数),完全不适合模拟订单引擎这类大规模数据场景。
- 窗口连接方案:属于KDB+原生的向量式操作,时间复杂度更接近O(N+M),大规模数据下性能碾压逐行遍历,是订单匹配场景的首选方案。
窗口连接实现步骤
1. 数据预处理(可选但推荐)
先按ric分组,仅同一标的的订单可能匹配,减少后续连接的无效计算:
t1:select by ric from t1; t2:select by ric from t2;
2. 连接+过滤+计算
通过等值连接关联同标的订单,再过滤方向相反、时间重叠的记录,最后计算交叉规模:
// 定义匹配条件:方向相反 + 时间区间重叠 matchCond:{[x;y] x.side != y.side and x.startTime <= y.endTime and y.startTime <= x.endTime}; // 按ric等值连接两张表 joined:ej[`ric] (t1; t2); // 过滤符合条件的记录,取两者size的最小值作为交叉规模 result:select ric, crossSize:min each (size; size_t2) from joined where matchCond[.;.]; // 补全无交叉的ric记录(让结果更完整) result:result lj select ric from t1 where ric not in result.ric; result:update crossSize:0f where null crossSize from result;
3. 验证结果
运行上述代码后,输出结果与预期一致:
ric crossSize ------------- a 90 b 1000 c 0
关键细节说明
- 时间重叠判断:
x.startTime <= y.endTime and y.startTime <= x.endTime是判断两个时间区间重叠的标准逻辑,覆盖包含、部分重叠等所有场景。 - 交叉规模计算:取两个订单size的最小值,因为实际可匹配的最大量受限于较小的订单规模。
- 向量操作优势:全程使用KDB+优化的向量式操作,避免了逐行循环的性能损耗,完全适配订单引擎的高吞吐量需求。
内容的提问来源于stack exchange,提问作者Cole
相关产品推荐
相关产品推荐

