我有下表,大约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
但这取决于您希望输出的外观。