KDB 简单键控 table 性能

KDB simple keyed table performance

我有以下 table,大约 300 万行。我想知道哪个 approach/attributes 我可以使用它的最大性能。我将只选择 inst + time 的精确匹配。

price_hist_5min_bars:([inst:`$();time:`timestamp$()]price:`float$())

此外,如果 table 仅用于报告或正在改变,方法是否会改变?此 table 不会即时添加任何行,但我将有另一个具有相同结构的日内 table,每 1 或 5 分钟添加一次行。感谢所有建议!

如果这是在内存中,我会想象你想要时间字段上的排序属性和 inst 字段上的组属性。

如果这是一个非常具体的用例,您只想提取 inst+time 的值,您可以考虑创建一个 inst 和 time 的复合键。 查找它会快得多,因为您可以在该键上使用唯一属性。 但是,如果您实时接收数据,则还必须考虑创建此类复合键的处理时间。

我已经用示例数据库进行了测试,如果我使用 `p# 属性:

,我可以获得轻微的改进
update `p#inst from `inst`time xasc price_hist_5min_bars

在这种情况下,`p#`g# 有优势,因为符号是有序的,没有分散。

有关详细信息,请参阅 attributes 上的 wiki 条目。

编辑

我最近得知,如果您可以重组 table,那么您就可以提高性能。使用以下示例 table:

q)n:10000000
q)t:2!update `p#sym from `sym`time xasc ([]sym:n?-100?`3;time:.z.d+n?1D;price:n?1000f)

我们可以使用 select:

设置基准
q)\ts:1000 select from t where sym=`bak,time=2017.11.29D23:59:59.520923942
210 1180496

您可以通过对每个 sym 的所有时间和价格值进行分组,按时间排序来重组:

q)show r:select `s#time,price by sym from t
sym| time                                                                                        ..
---| --------------------------------------------------------------------------------------------..
aan| `s#2017.11.29D00:00:00.131421536 2017.11.29D00:00:00.214382261 2017.11.29D00:00:00.914720445..
...

使用重组后的数据,我们可以 return 价格:

q)r[`bak][`price] r[`bak][`time]?2017.11.29D23:59:59.520923942
948.3733
q)\ts:1000 r[`bak][`price] r[`bak][`time]?2017.11.29D23:59:59.520923942
4 1824

sym 分组中记录的索引由下式给出:

q)r[`bak][`time]?2017.11.29D23:59:59.520923942
100638

显然上面的例子只有 returns 和 atom 而不是 table。如果你希望有一个 table 你可以尝试这样的事情:

q)flip (),/:@[;`sym;:;`bak]flip[r`bak]r[`bak][`time]?2017.11.29D23:59:59.520923942
time                          price    sym
------------------------------------------
2017.11.29D23:59:59.520923942 948.3733 bak
q)\ts:1000 flip (),/:@[;`sym;:;`bak]flip[r`bak]r[`bak][`time]?2017.11.29D23:59:59.520923942
7 2688

但这取决于您希望输出的外观。