【问题标题】:KDB query performance improvementKDB 查询性能提升
【发布时间】:2017-11-23 04:39:07
【问题描述】:

我有一个简单的表格,其中包含我用于股票算法回溯测试的价格。

price_hist:([pxkey:`$()]price:`float$())
update `g#pxkey from `price_hist

pxkey 是格式为“MSFT_5M_201710060945”的串联字符串,因此股票=MSFT,价格柱间隔=5 分钟,日期时间=201710060945。我使用连接字符串而不是单独的列,因为它很简单,而且我是 KDB 新手,我想快速运行一些东西。

我在那里有大约 500 万行,性能仅比使用完全相同数据的 MySql 稍快。关于如何改进这一点的任何想法(通过表结构、属性、查询等等)?仅供参考,我正在使用带有 qSharp 库的 C# 并查询我正在使用这种返回字典的格式:-

price_hist`MSFT_5M_201710060945

【问题讨论】:

    标签: c# performance kdb


    【解决方案1】:

    在 kdb+ 中创建数百万个生成符号绝不是一个好主意。我建议使用键控表而不是字典:

    bar5m:([sym:`$();time:`timestamp$()]price:`float$())
    

    一旦你填充它,你应该可以如下查询它

    bar5m[(`MSFT;2017.10.06D09:45);`price]
    

    为了提高性能,请确保表格按sym,time 排序,并将p 属性放在sym 上。

    【讨论】:

    • 在我的情况下 price_hist 也是一个键控表,对吧?因此,您建议的不同之处在于使用单独的字符串和日期时间列作为键[并且还将它们拆分为不同的条形表]。单独的字符串和日期时间列会对性能产生很大影响吗?
    • 从技术上讲,键控表是 kdb+ 中的字典。它是从一个表到另一个表的映射。如果这些表只有一列,则键控表与简单的字典几乎没有区别。我的回答中的主要建议是不要使用组合符号,而是使用多个键列。
    • 明白了——我会试试的(可能会回来跟进)。哦还有一件事..你能给我一个快速的语法来从现有数据创建一个新表吗?这意味着将字符串转换为日期。我可能需要几个小时才能把它弄好,但你需要 20 秒!非常感谢!
    • 嗨@Alexander,我尝试了你的建议,性能并没有更快。也许我没有正确设置属性。这是我所做的:- bar5m:s#([inst:$();time:timestamp$()]price:float$()) bar5m insert (insttime xasc select from price_hist_bar5m) update p#inst from bar5m
    猜你喜欢
    • 2020-06-04
    • 2021-08-14
    • 2014-04-02
    • 2016-03-24
    • 2016-03-23
    • 1970-01-01
    • 2015-10-17
    • 2020-01-10
    相关资源
    最近更新 更多