问题描述
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
-分区选择-就是所有这些魔术发生的地方,如果需要所有详细信息,请参阅其定义。)
您有几种选择可以避免出现错误。
- 修改查询,避免单独使用
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)
- 使用.Q.view定义一个子视图,以排除缺少表的分区; kdb不会缓存或以其他方式访问它们。
如果您选择的日期范围中包含缺少表的分区,则先前的解决方案将不起作用。在这种情况下,您可以
,您可能需要创建丢失的表。我相信,当您像在分区表上那样对'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