为什么我无法进行计数,但从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或在空白处。

以下任何一项均有效;第一种是最简单的方法,而其他一种在您编写一般情况的查询并且不事先知道字段名称的情况下很有用。

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-fill-hdb

,

'count i'将扫描每个分区,而不管where子句中指定的内容如何。因此这两个分区很可能不完整。

最好为此类或类似情况选择一个实际的列

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

将阻止扫描所有分区。

Jason

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...