Каков рекомендуемый способ запроса документов из разных разделов в CosmosDB?

При использовании Azure Cosmos DB и запросе одного раздела я просто указываю ключ раздела в FeedOptions. Но когда мне нужно запросить n разделов, у меня есть (afaik) 2 варианта:

  1. Запустить отдельную задачу для каждого раздела и объединить результат в код моего приложения
  2. Установите флаг «EnableCrossPartitionQuery» (вместе с MaxDegreeOfParallelism) в FeedOoptions и запретите мои разделы в запросе.

Когда мне нужно применить критерии сортировки вместе с разбиением на страницы по всему набору результатов (по всем разделам), я думаю, что первый подход достигнет своих пределов.

Каков рекомендуемый способ запроса между несколькими разделами в Cosmos DB с помощью .NET SQL API?


person Markus S.    schedule 15.10.2018    source источник


Ответы (1)


Первый подход не рекомендуется, если вы не знаете все возможные значения ключа раздела, которые есть в ваших документах, и не готовы написать некоторый параллельный код запроса. Это эффективно, только если вы хотите запросить несколько разделов, но не все.

Включение EnableCrossPartitionQuery - рекомендуемый подход, если вы хотите запросить все разделы, но в идеале вы хотите использовать его как можно реже.

CosmosDB знает, является ли определение ключа секции частью запроса, и ограничивает его результаты секциями для этого запроса, если указаны значения ключа секции.

Это означает, что если вы напишете что-то вроде select * from c where c.partitionKey = 'something' || c.partitionKey = 'somethingelse' и включите параметры EnableCrossPartitionQuery, ваш запрос будет выполнен только для двух разделов, которые являются частью вашего запроса (something и somethingelse).

person Nick Chapsas    schedule 15.10.2018
comment
Спасибо за ваш отзыв. Я знаю все ключи разделов. Обычно это от 1 до 5, максимум до ~ 10 (представляющих устройства на пользователя). Отличается ли производительность этих двух подходов? AFAIK при использовании EnableCrossPartitionQuery = true результаты каким-то образом объединяются на стороне клиента, но не на стороне сервера. Это правда? Также при использовании сортировки / разбиения на страницы по разделам: я думаю, что единственный способ сделать это - использовать EnableCrossPartitionQuery-Way. Это верно? - person Markus S.; 16.10.2018
comment
Отличается ли производительность этих двух подходов? Это зависит от того, как вы это кодируете. Это просто не рекомендуется, потому что оно должно быть отвлечено от вас и позаботиться о нем с помощью SDK. Также да, если вы не используете настройку перекрестного разделения, у вас не будет надежной сортировки / разбиения на страницы. - person Nick Chapsas; 16.10.2018