【问题标题】:how to improve time for select in kdb如何改善 kdb 中的选择时间
【发布时间】:2013-05-10 13:58:35
【问题描述】:

我在本地机器上创建了一个贸易数据库,按日期分区。

select from trade where date=x

大约需要 100 毫秒,但当我这样做时:

select from trade where date=x,sym=`alpha

大约需要 1-3 秒。

我缺少什么技巧(使用`g#sym 会出现错误'par)。

【问题讨论】:

    标签: database kdb q-lang


    【解决方案1】:

    您可以使用 dbmaint.q 将属性应用于分区表。见here。具体看setattrcol函数。添加属性将显着加快查询速度。如果可能,我建议在 id 列上使用 p#。这对于查找应该更快,但更难维护。

    【讨论】:

    • 我试过 setattrcol[:/kdb/testdb;trade;sym;p#]。它给了我一个类型错误。我使用 dbmaint.q 给出的示例数据库进行了尝试,它运行良好,但使用我的示例数据库它给出了类型错误。我正在尝试检查我在创建示例数据库时是否遗漏了什么。如果您知道任何明显的错误,请提出建议。
    • 可以给表的元数据吗?为了应用 p#,您需要确保 sym 列的顺序正确,即每个 sym 的所有记录彼此相邻。另一件事,我相信你上面的电话,你不需要#。 is 应该只是 [:/kdb/testdb;trade;sym;p] (带有必要的反引号)。
    • 元数据如下: c t f a date "d" s trdId "f" sym "s" symType "s" expiry "d" option "s" corpAction "s" strike "f " 时间 "v" 价格 "f" 数量 "f"
    • 你是对的,它不是按符号分组的。在将数据库写入磁盘之前,我是否需要在创建数据库的脚本中执行g#. or should i add a g#。正如你提到的,我只尝试了 p(没有 #),但它给了我一个错误 u-fail.Studio 提示:可能这个错误是指无法应用 u# to data (not unique values), e.g u#1 1。
    • 写入磁盘后设置属性。 g# 不需要任何维护,即更新不会删除该属性。如果您想使用 p#,确保所有 sym 记录彼此相邻的最简单方法是排序,但如果它是一个大型数据集,这将需要一些时间。它还需要排序,并且在每次更新后重新应用该属性。
    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多