#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
— секционированный выбор — вот где происходит все это волшебство, смотрите Его определение, если вам нужны все подробности.)
У вас есть несколько вариантов, чтобы избежать ошибки, которую вы получаете.
- Измените запрос, чтобы избежать наличия
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)
- Используйте .Q.view для определения подвида, чтобы исключить разделы с отсутствующими таблицами; kdb не будет кэшировать или иным образом обращаться к ним.
Предыдущие решения не будут работать, если диапазон дат в вашем выборе включает разделы с отсутствующими таблицами. В этом случае вы можете либо
Ответ №2:
Вероятно, вам нужно создать недостающие таблицы. Я полагаю, что при выполнении «подсчета i» в секционированной таблице, как вы это сделали, он подсчитывает каждый отдельный раздел (а не только те, которые указаны в вашем запросе) и кэширует эти показатели.Q.pn
Если вы запустите .Q.chk [корневое расположение HDB], он должен создать недостающие таблицы, и ваш запрос должен сработать
Ответ №3:
‘count i’ будет сканировать каждый раздел независимо от того, что указано в предложении where. Так что, скорее всего, эти два раздела являются неполными.
Лучше выбрать фактический столбец для подобных вещей или что-то вроде
select count i>0 by date from tableName where date within(.z.d-8;.z.d)
предотвратит сканирование всех разделов.
Джейсон