You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于行级特定时间范围关联两张订单表(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:42:47