C# KDB简单键控表性能

C# KDB简单键控表性能,c#,kdb,q-lang,C#,Kdb,Q Lang,我有下表,大约3百万行。我想知道我可以使用哪种方法/属性来获得最大的性能。我将只选择inst+时间的精确匹配 price_hist_5min_bars:([inst:`$();time:`timestamp$()]price:`float$()) 此外,如果表格仅用于报告或正在更改,方法是否会更改?这个表不会动态添加任何行,但我将有另一个具有相同结构的日内表,它将每隔1或5分钟添加行。感谢所有建议 如果这是在内存中,我可以想象您希望时间字段上有一个排序属性,而inst字段上有一个group属性

我有下表,大约3百万行。我想知道我可以使用哪种方法/属性来获得最大的性能。我将只选择inst+时间的精确匹配

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

此外,如果表格仅用于报告或正在更改,方法是否会更改?这个表不会动态添加任何行,但我将有另一个具有相同结构的日内表,它将每隔1或5分钟添加行。感谢所有建议

如果这是在内存中,我可以想象您希望时间字段上有一个排序属性,而inst字段上有一个group属性

如果这是一个非常特定的用例,您只想提取inst+time的值,那么您可以考虑创建inst和time的复合键。 查找此项的速度会快得多,因为这意味着您可以在该键上使用unique属性。
但是,如果您实时接收数据,您还必须考虑创建这样一个复合密钥所需的处理时间。

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

update `p#inst from `inst`time xasc price_hist_5min_bars
在这种情况下,`p比`g有优势,因为符号有序且不分散

有关详细信息,请参见上的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设置基准:

您可以通过将每个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..
...
使用此重组数据,我们可以返回以下价格:

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
显然,上面的示例只返回和atom,而不是表。如果您想要一张桌子,您可以尝试以下方式:

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

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

谢谢@emc。我已经试过你的建议了,它似乎是我能尽快得到的。我确实首先尝试了整合键方法,但下面的链接建议我不要使用它。我只是在使用字符串,除非你有其他想法。此方法比我的合并字符串键(仅供参考)稍快。嘿,@TokyoD不确定你指的是字符串还是符号。应用唯一属性的符号字段的单键查找应该是最快的。可能需要看一个例子。正如在另一个线程中所说的,这实际上不是正常建议的或可伸缩的。我想问你问题的最大表现部分。最有可能的解决方案是在内存中的数据上加一个g和s,每1或5分钟添加一次。如托马斯的回答中所述,将历史静态数据分开。我用第二个更有效的例子编辑了我的回答。如果你能重组你的数据,那么你可能会从中受益。非常感谢@thomas。对反应迟缓表示歉意。我已经使用了各种属性设置,您最初从insttime xasc price_hist_5min_bars提出的更新pinst的建议使我获得了迄今为止最好的性能,在一个有3m行的表上调用1m次时,平均为0.159毫秒。我还将尝试重组表的方法。
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