从分区数据库中删除表太大而无法加载到内存中的行

0 kdb

你不能直接从分区数据库中删除数据行,所以我看到的方法是:

  • 使用日期的 where 子句将表加载到内存中

  • 从内存中的表中删除行

  • 将表重新保存到磁盘,覆盖旧数据

但这假设该分区可以加载到内存中。如果做不到,那我能做什么呢?

我查看了 dbmaint.q 脚本,但似乎没有修改行的解决方案,只有列。

ter*_*nch 5

最好的选择是加载特定的列,您将在该列上确定要删除的行,并找到要保留的行的索引。然后迭代每列并根据这些索引删除每列中的条目。就像是:

/equivalent to delete from myTab where date=2022.01.02, myCol=`xx
keep_idx:where not`xx=get`:2022.01.02/myTab/myCol;

/iterate through each col, remove/index and write back down
{c set @[;keep_idx]get c:` sv`:2022.01.02/myTab,x}each get`:2022.01.02/myTab/.d
Run Code Online (Sandbox Code Playgroud)

但是,您需要处理一些注意事项:

  • 您可能会丢失原始列上的任何属性,您必须检查属性并随后恢复
  • 如果在原始写入中使用了压缩,则应在重写时保持相同的压缩
  • 如果任何列重写失败,那么该分区中的表的列长度将不一致。即它将是不可选择的