функция datetimepart sql api cosmos db увеличивает rus

#azure-cosmosdb #azure-cosmosdb-sqlapi

Вопрос:

в моей базе данных cosmos db хранятся данные за минутные интервалы времени, я хотел бы запросить их с использованием разных интервалов, в зависимости от даты начала и даты окончания. Но при использовании функции DateTimePart значения RUs резко возрастают. Без функции datetimepart данные за месяц составляют 184, если я добавлю функцию datetimepart, она увеличится до 6000.

Я попробовал выполнить запрос следующим образом:

 SELECT c.config,c.datetime
FROM c where c.config='DBM'  and c.datetime >='2021-04-21T07:02:16' 
and c.datetime <='2021-05-21T07:02:16' and (DateTimePart('minute' , c.body.metadata.datetime) % 60) = 0
 

а также с помощью соединения подзапросов, но все равно не повезло с отключением rus.

У кого-нибудь есть какая-либо другая идея, которую я мог бы использовать для запроса данных с интервалом, поэтому, в основном, если я запрашиваю данные за месяц, но выбираю часовой интервал, я должен получать данные за каждый час за этот месяц

Саша

Ответ №1:

Для распространенных и дорогостоящих запросов может иметь смысл включить дополнительные производные поля в вашу модель, чтобы оптимизировать стоимость запроса. Например, если вы всегда запрашиваете элементы на отметке часа, вы можете записать эти записи с помощью дополнительного свойства minuteOfHour: 0 , а затем использовать более простой запрос:

 SELECT c.config,c.datetime
FROM c where c.config='DBM' and c.minuteOfHour = 0 and c.datetime >='2021-04-21T07:02:16' 
and c.datetime <='2021-05-21T07:02:16'
 

Другими словами, стратегия состоит в том, чтобы предварительно вычислить все один раз, а не заставлять механизм запросов выполнять работу по каждому запросу для каждого элемента.

Это также может помочь добавить один или несколько составных индексов, чтобы снизить стоимость запроса.

Конечно, всегда тестируйте различные подходы, чтобы увидеть, что дает наименьшие затраты.