为什么我计数不起作用,但从hdb中选择却很好



我有一个分区的hdb,下面的查询工作正常:

select from tableName where date within(.z.d-8;.z.d)

但以下查询中断:

select count i by date from tableName where date within(.z.d-8;.z.d)

出现以下错误:

"./2017.10.14/:./2017.10.15/tableName. OS reports: No such file or directory"

知道为什么会发生这种事吗?

如错误所示,2017.10.15分区中没有名为tableName的表。对于分区数据库,kdb缓存表计数;当它运行具有以下属性的第一个查询时,就会发生这种情况:

  • ;选择";查询的一部分是count i或分区字段本身(在您的示例中为date(
  • where子句要么为空,要么仅约束分区字段

(.Q.ps——分区选择——是所有这些魔法发生的地方,如果你需要所有细节,请参阅它的定义。(

您有几个选项可以避免出现错误。

  1. 修改查询以避免count i本身或where为空

以下任何一项都可以工作;第一种是最简单的,而如果您正在为一般情况编写查询,并且事先不知道字段名,则其他方法非常有用。

select count sym by date where date within (.z.d-8;.z.d) / any field except i
select count i by date where date within (.z.d-8;.z.d),i>=0
select `dummy, count i by date where date within (.z.d-8;.z.d)
select {count x}i by date where date within (.z.d-8;.z.d)
  1. 使用.Q.view定义一个子视图以排除缺少表的分区;kdb不会缓存或以其他方式访问它们

如果您选择的日期范围包括缺少表的分区,则以前的解决方案将不起作用。在这种情况下,您可以选择

  • 运行.Q.chk在错误的地方创建空表;或
  • 运行.Q.bv为缺少分区的表构造表模式字典

您可能需要创建丢失的表。我相信,当像您所做的那样对分区表执行"count I"时,它会对每个分区(而不仅仅是查询中的分区(进行计数,并将这些计数缓存在.Q.pn中

如果您运行.Q.chk[HDB根位置],它应该会创建丢失的表,并且您的查询应该可以使用

https://code.kx.com/q/ref/dotq/#qchk-填充hdb

无论where子句中指定了什么,'count i'都将扫描每个分区。所以这两个分区很可能是不完整的。

最好为类似的东西或类似的东西选择一个实际的列

select count i>0 by date from tableName where date within(.z.d-8;.z.d)

将阻止扫描所有分区。

Jason

相关内容

最新更新