如何有效地执行大型查询?

How do I efficiently execute large queries?

考虑以下演示模式

trades:([]symbol:`$();ccy:`$();arrivalTime:`datetime$();tradeDate:`date$(); price:`float$();nominal:`float$());
marketPrices:([]sym:`$();dateTime:`datetime$();price:`float$());
usdRates:([]currency$();dateTime:`datetime$();fxRate:`float$());

我想编写一个查询,以便在 arrivalTime 之后尽快获取价格并转换成美元。我的初学者方法是创建中间表,进行一些过滤和翻译列名以保持一致,然后使用 ajajo 将它们连接起来。

在这种情况下,只有 2 个中间表。在我的实际情况下,必然有 7 个中间表和记录数,虽然按照 KDB 标准来说不算大,但也不小。

什么是此类查询的最佳做法?在我看来,创建所有这些中间表非常耗费资源。中间表的替代方法是 2 有一个看起来非常复杂的单一查询。这真的会有帮助吗?还是这种资源消耗就是要付出的代价?

要在活动结束后加入到下一个最接近的时间,请查看以下问题:

假设这就是您要查找的内容,那么您应该能够在连接之前或之后执行价格计算(根据表的大小,在连接之后进行计算可能会更快)。最后,我认为您将需要两个(可能按上述修改)aj(市场数据的汇率,交易的市场数据)。

如果这不是您要查找的内容,那么我可以提供一些更具体的信息,尽管一些示例数据会很有用。

我的想法:

  1. 您的代码 verbose/readible 越多,您以后调试和以后 readers/users 的代码就越好。

  2. 除非绝对必要,否则我会尽量避免创建相同的 7 个副本 table。如果您正在处理大 tables 内存,可能很快就会成为一个问题。特别是如果处理需要很长时间,您可能会产生大量内存峰值。我尝试在不同阶段继续更新 1-2 个变量,例如:

res: select from trades;
res:aj[`ccy`arrivalTime;
  res;
  select ccy:currency, arrivalTime:dateTime, fxRate from usdRates 
  ]
res:update someFunc fxRate from res;
  1. Sean 打败了我,但是 aj 一段时间后/反向 aj 通过切换 binbinr 相对简单在 k 代码中。查看建议的答案。

  2. 我不确定为什么你需要 7 个中介 tables 除非你可能正在计算交叉汇率?在这种情况下,我通常会将带有 2 个 aj 的 ccy1 和 ccy2 连接到同一个 table 并从那里获取它。

  3. 尽管如果您无法控制源数据,在您的情况下这可能是不可避免的,但相似的列名/跨模式的一致性通常更好。例如符号与符号