我们收到来自交易所的报价并将其存储在KDB Ticker工厂。我们希望分析RDB和HDB中的卷,而对这些数据库的性能影响最小,因为它们也被其他团队使用。
答案 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上的负端口号用于多线程输入队列以最小化查询冲突(尽管它不一定能使事情更快)。