Почему подсчет по i не работает, но выбор из hdb работает просто отлично?

#kdb

#kdb

Вопрос:

У меня разделенный 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"
  

Есть идеи, почему это может произойти?

Ответ №1:

Как указывает ошибка, в разделе для 2017.10.15 нет таблицы с именем tableName is. Для секционированных баз данных 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 для построения словаря схем таблиц для таблиц с отсутствующими разделами.

Ответ №2:

Вероятно, вам нужно создать недостающие таблицы. Я полагаю, что при выполнении «подсчета i» в секционированной таблице, как вы это сделали, он подсчитывает каждый отдельный раздел (а не только те, которые указаны в вашем запросе) и кэширует эти показатели.Q.pn

Если вы запустите .Q.chk [корневое расположение HDB], он должен создать недостающие таблицы, и ваш запрос должен сработать

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

Ответ №3:

‘count i’ будет сканировать каждый раздел независимо от того, что указано в предложении where. Так что, скорее всего, эти два раздела являются неполными.

Лучше выбрать фактический столбец для подобных вещей или что-то вроде

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

предотвратит сканирование всех разделов.

Джейсон