【发布时间】:2015-02-28 14:15:54
【问题描述】:
我们从交易所收到报价并将其存储在 KDB Ticker Plant。我们希望分析 RDB 和 HDB 中的卷,对这些数据库的性能影响最小,因为它们也被其他团队使用。
- 首先,我们如何创建一个函数,将一天分成 10 分钟间隔,并为每个间隔创建一个包含交易量的统计信息?我们需要使用哪些 KDB 函数?
- 其次,怎么安全呢?我们应该在循环中逐部分提取记录还是一次查询一次?我们的数据库中每天有大约 1.5 亿条记录。
【问题讨论】:
我们从交易所收到报价并将其存储在 KDB Ticker Plant。我们希望分析 RDB 和 HDB 中的卷,对这些数据库的性能影响最小,因为它们也被其他团队使用。
【问题讨论】:
我将对表名和列名做一些假设,我相信你可以推断出来
我们从交易所收到报价并将其存储在 KDB Ticker Plant 中
根据定义,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 上的负端口号用于多线程输入队列,以最大程度地减少查询冲突(尽管它不一定会使事情变得更快)。
【讨论】: