我有下表,大约3m行。我想知道我可以使用哪种方法/属性来发挥最大的性能。我只会选择inst + time的完全匹配项。

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


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

最佳答案

我已经使用示例数据库进行了测试,如果使用use `p#属性,可以得到一些改进:

update `p#inst from `inst`time xasc price_hist_5min_bars


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

有关更多信息,请参见attributes上的Wiki条目。

编辑

我最近得知,如果可以重组表,则可以提高性能。使用以下示例表:

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


您可以通过将每个交易品种的所有时间和价格值分组,按时间排序来进行重组:

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..
...


使用此重组数据,我们可以通过以下方式返回价格:

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


符号组中记录的索引由下式给出:

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


显然,以上示例仅返回和原子,而不返回表。如果您希望有一张桌子,可以尝试如下操作:

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


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

10-07 16:15
查看更多