KDB-历史表-这样做的“正确”方法是什么?

时间:2018-07-30 23:19:58

标签: kdb

我有一个销售点系统,可将我的数据导出到.csv,然后将其导入KDB。当前,我要做的是将所有数据从POS导出到csv,然后创建一个表。我有大约10个月的销售数据,我的csv文件约为11mb。随着时间的流逝,我想象csv文件将非常庞大,我想知道这是否效率低下。

在我的老工作中,我们要做的是为每一天的数据创建一个表,然后会有一个_hist表,其中将合并所有日常文件。因此,如果我只想查看当天的数据,我将查看invoicedata表,如果我想一直查看,则将查询invoidata_hist表,并将查询设置为查看(dateA; dateB)中的日期。我想知道是否应该以这种方式而不是现在的方式进行设置。

我最好拥有一个包含所有数据的非常大的csv文件,还是应该每天创建一个csv文件?如果第二种方法更好,谁能给我一个构想这一切的最佳方法的想法?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您的记录总数不超过几百万,那么分区可能就算过分了。

如果我的每天表计数在100万左右或更多,我会考虑对数据进行分区。

您还需要考虑如何访问数据,例如在last-n分区表中检查不频繁出现的客户的date记录可能会影响您的查询性能,因为您必须进行迭代回溯。在这种情况下,张开的表或按年划分的表可能是合适的。

已经说过,有多种方法可以将数据存储在磁盘上,请检查this link

  • 二进制序列化(将表存储为二进制块)

    `:/db/t set ([] ti:09:30:00 09:31:00; p:101.5 33.5)

  • splayed table(垂直/列分区)

    `:/db/t/ set ([] ti:09:30:00 09:31:00; p:101.5 33.5) // trailing "/" in the file handle

  • partitioned table(水平分区的展开表)

    .Q.dpft[directory;partition;`p#field;tablename]

  • segmented tables(进行高级分区以获得更好的查询/减少地图结果)

    .Q.dpft[directory;partition;`p#field;tablename]

  • save function-将数据保存为二进制/ xml / csv / txt / xml格式。

由于您在问题中要求提供日期分区表,因此实际上可以使用不同的方法partition your data

  • 每日
  • 每月
  • 每年
  • long(可在任何long列上自定义)

您可能希望根据表计数将数据存储在每月分区中。

要将数据保存到分区,可以使用.Q.dpft函数

.Q.dpft[directory;partition;`p#field;tablename] 

来自code.kx的示例:

q)trade:([]sym:10?`a`b`c;time:.z.T+10*til 10;price:50f+10?50f;size:100*1+10?10)
q).Q.dpft[`:db;2007.07.23;`sym;`trade]
`trade