【问题标题】:Difference when you query from KDB HDB and KDB RDB从 KDB HDB 和 KDB RDB 查询时的区别
【发布时间】:2015-02-17 06:03:52
【问题描述】:

我听说从 HDB 和 RDB(内存中)数据库查询(选择等)时存在差异。 当我们应该使用 HDB 特定查询和 RDB 特定查询以及如何查询时,是否可以描述所有可能的场景:即 HDB 的查询示例和 RDB 的相同示例?

【问题讨论】:

    标签: kdb q-lang


    【解决方案1】:

    在我的头顶:

    分区的 HDB 表将有一个“虚拟”日期列

    RDB 表(通常)没有“日期”列

    对于分区 HDB 表,虚拟“i”列的行为不同 (http://code.kx.com/q/ref/dotq/#qind-partitioned-index)

    HDB 表(除非存储平面/序列化)不会立即完全拉入内存,数据是按需读取的

    HDB表中的符号列将被枚举,内存中的RDB表将不被枚举

    我无法给出真实的例子,但你只需要在查询时记住这些

    【讨论】:

      【解决方案2】:

      如果您使用的是普通 rdb/hdb 设置,那么情况如下:

      • tkeplant 收集 x 毫秒的数据并泵给听众
      • rdb 就是这样一种监听器。它将保存从今天午夜到今晚午夜之前的数据
      • 午夜 tickerplant 发送 .u.end 消息
      • 这会调用 rdb 将内存表转储到 2014.12.19/ 目录内的磁盘上
      • 请注意,rdb 上的架构是时间、符号,然后是其他列。在 hdb 上,这会切换到日期(虚拟)、sym(p attr)、时间(在 sym 内排序)

      所以你的 where 子句标准是:

      • 如果要查询今天的数据,那就是rdb
      • 今天之前的任何东西,都是 hdb
      • 任何混合,在您的 hdb 上创建从 rdb 提取数据并加入的函数

      对于 rdb 的最优查询总是

      select from table where time ...
      

      因为 rdb 表是按时间排序的。

      hdb 的最佳查询总是

      从 date=2014.12.24, sym=`AAPL, time ...的表中选择...

      因为它减少了对磁盘的查找(只需要检查2014.12.24目录中的数据),是sym parted然后在sym内进行时间排序(虽然技术上显然没有s属性)。将日期作为 where 子句的第一部分非常重要! :)

      【讨论】:

        【解决方案3】:

        到目前为止,我遇到了以下在 hdb 中不起作用的示例查询。

        1. 计数表名
        2. 从表名中选择 [10]
        3. delete/update/insert 语句在 hdb 重新启动之前只有临时效果

        当我遇到更多时,我会更新这个列表

        【讨论】:

        • 我认为这并不能完全回答这个问题。
        • 嘿@Ramparasad,如果您对查询 kdb+ HDB 有任何疑问,请随时提出问题。 stackoverflow.com/questions/ask
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多