Azure Cosmos DB - неправильное и непостоянное количество документов

Я вставил ровно 1 миллион документов в контейнер SQL Azure Cosmos DB с помощью Bulk Executor. Ошибок не зарегистрировано. Все документы имеют один и тот же ключ раздела. Контейнер предоставляет 3200 RU / s, неограниченную емкость хранилища и запись для одного региона.

При выполнении простого запроса подсчета:

select value count(1) from c where c.partitionKey = @partitionKey

Я получаю разные результаты - от 303 000 до 307 000.

Этот запрос подсчета отлично работает для небольших разделов (от 10k до 250k документов).

Что могло вызвать такое странное поведение?


person Spiff    schedule 12.09.2019    source источник


Ответы (1)


Это разумно в космосе дб. Во-первых, вам нужно знать, что Document DB накладывает ограничения на Response page size. Эта ссылка суммирует некоторые из этих ограничений: Ограничения хранилища Azure DocumentDb - что что они означают?

Во-вторых, если вы хотите запрашивать большие данные из Document DB, вы должны учитывать проблему производительности запросов, пожалуйста, обратитесь к этой статье: Настройка производительности запросов с помощью Azure Cosmos DB.

Просматривая Document DB REST API, вы можно наблюдать несколько важных параметров, которые оказывают значительное влияние на операции запроса: x-ms-max-item-count, x-ms-continuation.

Итак, ваша ошибка связана с узким местом настройки RU. Запрос count ограничен количеством RU, выделенных для вашей коллекции. Результат, который вы бы получили, будет иметь токен продолжения.

У вас может быть 2 решения:

1. Конечно, можно было бы поднять настройку RU.

2. За деньги вы можете продолжить поиск следующего набора результатов с помощью токена продолжения и продолжать добавлять его, чтобы получить общее количество (возможно, в SDK).

Вы можете установить значение Максимальное количество элементов и разбить свои данные на страницы с помощью continuation tokens . Document Db sdk поддерживает беспрепятственное чтение данных с разбивкой на страницы. Вы можете обратиться к фрагменту кода Python, как показано ниже:

q = client.QueryDocuments(collection_link, query, {'maxItemCount':10})
results_1 = q._fetch_function({'maxItemCount':10})
#this is a string representing a JSON object
token = results_1[1]['x-ms-continuation']
results_2 = q._fetch_function({'maxItemCount':10,'continuation':token})

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

select value count(1) from c в обозревателе запросов. Получается только часть документов на каждой странице. Поэтому мне нужно добавить их все, нажав кнопку Next Page.

введите здесь описание изображения

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

person Jay Gong    schedule 16.09.2019
comment
В этом есть смысл, хотя довольно удивительно, что эта деталь реализации просачивается до клиента. - person Spiff; 16.09.2019