【问题标题】:Point in time queries in kdbkdb 中的时间点查询
【发布时间】:2013-05-29 15:32:05
【问题描述】:

我经常需要选择分区表中的最后一行,直到某个时间。这是我使用的:

select last A,last B,last C from mytable where date=2013.05.23,ts<10:30:00,A in (`Bob`Jane)

此查询可能会在 10:30:00 之前加载所有 `Bob`Jane 行,然后返回最后一行。有没有更有效的方法在 kdb 中运行时间点查询?

我的表的一些基准数据:

/select all data
\t t: select ...
1724i

count t
2225311i

\t select ... ts<15:00:00
2040i

\t select ... ts<12:00:00
1092i

\t select ... ts<10:00:00
521i

【问题讨论】:

  • where 子句不应返回所有行;在最坏的情况下,它应该只生成有效索引列表。您是否看到此查询与您的预期相比出现了明显的放缓?无论如何,这张表的结构如何?这一切都在记忆中吗?张开?分区了吗?
  • @chrisaycock 为问题添加了更多信息。

标签: kdb


【解决方案1】:

另一种选择是使用以下内容:

select A,B,C from mytable where date=2013.05.23,ts<10:30:00,A in (`Bob`Jane),i=last i

虽然我怀疑您目前的性能会不会有任何改进。

更重要的是表的类型(在内存中/展开/分区(包括如何分区))和使用的属性(如果有的话)。

【讨论】:

  • 这是一个分区的、展开的表。我在问题中添加了更多信息。
  • 你有设置属性吗?
  • 我不知道。它是分区表,由 ts 索引。我只需要在特定日期运行时间点查询。
  • 使用meta 将指示哪些列具有属性。如果您真的想充分利用 kdb+,如果您的数据集足够大,我强烈建议您使用 attributes
  • 如果表是由 ts 索引的,kdb 是不是可以定位到与请求的时间戳匹配的最后一行,然后在表上依次向后走以找到与选择条件?
【解决方案2】:

aj 提供您正在寻找的功能:

http://code.kx.com/q/ref/joins/#aj-aj0-asof-join

在提供的链接中有一些aj 的性能提示。

【讨论】:

  • OP 要求查询。 asof-join 将生成一个新表。
  • 正确,我不需要连接来自两个不同表的数据。你能用aj发布一个查询示例吗,我可以尝试对其进行基准测试。
  • 您可以构造一个查询表作为输入。链接中有一个功能示例。
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多