如何按时间间隔创建KDB查询哪些分组并且不会降低RDB?

时间:2015-02-28 14:15:55

标签: kdb q-lang

我们收到来自交易所的报价并将其存储在KDB Ticker工厂。我们希望分析RDB和HDB中的卷,而对这些数据库的性能影响最小,因为它们也被其他团队使用。

  • 首先,我们如何创建一个以10分钟为间隔分割一天的功能,并为每个间隔创建一个带有音量的统计数据?我们需要使用哪些KDB功能?
  • 其次,如何安全地做到这一点?我们应该使用一个查询按部分或一次性提取循环中的记录吗?我们的数据库中每天有大约1.5亿条记录。

1 个答案:

答案 0 :(得分:2)

我会对表名和列名作出一些假设,我相信你可以推断

  

我们收到来自交易所的报价并将其存储在KDB Ticker工厂

作为定义问题,tickerplant仅在非常短的时间内存储数据,然后将其记录到文件并将数据发送到RDB(和其他侦听器)。

  

对这些数据库的性能影响最小

这一切都取决于(a)您的数据量(b)最佳的where子句。它还取决于您的计算机上是否有足够的RAM来处理查询。越接近关键,操作系统分配内存越困难,因此查询所需的时间越长(尽管与从磁盘上获取数据相比,内存分配时间相形见绌 - 因此磁盘速度也是一个因子)。

  

首先,我们如何创建一个以10分钟间隔和每个间隔分割一天的功能,创建一个带有音量的统计数据?

你的朋友在这里是xbar:http://code.kx.com/q/ref/arith-integer/#xbar

getBy10MinsRDB:{[instrument;mkt]
    select max volume, min volume, sum volume, avg volume by 10 xbar `minute$time from table where sym=instrument, market=mkt
};

对于HDB,最佳查询(对于日期分开的数据库)是date,然后是sym,然后是time。在你的情况下,你还没有要求时间,所以我省略了。

getBy10MinsHDB:{[dt;instrument;mkt]
    select max volume, min volume, sum volume, avg volume by 10 xbar `minute$time from table where date=dt,sym=instrument, market=mkt
};
  

我们是应该用循环部分或一次性提取一个查询中的记录吗?

不,这是在KDB中做事的最糟糕的方式:-)这里几乎总是一个很好的矢量解决方案。

  

我们的数据库中每天有大约1.5亿条记录。

由于KDB是一个柱状数据库,因此您拥有的列类型与记录数一样重要;因为这会影响记忆。

  

因为他们也被其他团队使用

如果像上面这样的简单查询导致问题,您可能需要考虑按市场划分表格,以减少查询冲突和加载。如果内存不是问题,请考虑-s用于HDB的多线程查询(多天)。考虑HDB上的负端口号用于多线程输入队列以最小化查询冲突(尽管它不一定能使事情更快)。