CDB-简单键表性能
作者:互联网
我有下表,大约3m行.我想知道我可以使用哪种方法/属性来发挥最大的性能.我只会在即时比赛中选择完全匹配的比赛.
price_hist_5min_bars:([inst:`$();time:`timestamp$()]price:`float$())
此外,如果表格仅用于报告或正在更改,该方法是否会更改?该表不会即时添加任何行,但我将拥有另一个具有相同结构的日内表,该表每1或5分钟添加一次行.所有建议表示赞赏!
解决方法:
我已经使用示例数据库进行了测试,如果使用`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
但这取决于您希望输出的外观.
标签:kdb,q-lang,c 来源: https://codeday.me/bug/20191110/2014686.html