У меня есть вопрос о Pageable< T >
в C#. У меня есть хранилище таблиц в Azure named-Domains. Я использую пакет nuget Azure.Data.Tables и запрашиваю все домены, которые я использую:
var domains = _localDomainTableClient
.Query<Domain>()
.AsPages()
.SelectMany(d => d.Values);
Но я что-то не понимаю. Что, если я использую Query<T> без метода AsPages?
IEnumerable<Domain> domainsPAges = tableClient.Query<Domain>();
Я знаю, что AsPages()
возвращает набор страниц. Например, если у меня есть 10000 элементов в таблице, Query<Domain>().AsPages()
должен сделать 10 запросов к таблице и вернуть мне 10 страниц с 1000 элементами на каждой странице (если я не изменил значение по умолчанию), но я не понимаю, что именно происходит, если я не используйте AsPages() ?
Пример:
IEnumerable<Domain> domainsPAges = tableClient.Query<Domain>();
Query<Domain>()
возвращает Pageble< T >
но, снова делает 10 запросов к таблице или берет все элементы до переполнения памяти (по умолчанию 4 Мб) или берет все элементы сразу?
Я проверяю документацию, но не могу найти то, что мне нужно.
Набор значений, для повторения которых может потребоваться несколько запросов на обслуживание.
Коллекция значений, извлеченных на страницах
Что это вообще значит?
Спасибо за помощь.
Сколько запросов сделает Query, если AsPages() не используется?
В C# метод Query является частью пакета SDK для Azure Cosmos DB.
Метод Query<T>
извлечет все совпадающие результаты в одном запросе к базе данных. Такое поведение известно как однораздельный запрос.
Если запрос включает несколько разделов, метод Query выполнит несколько запросов для получения всех совпадающих результатов. Точное количество запросов будет зависеть от количества задействованных разделов и размера результирующего набора.
Если метод AsPages()
не используется, то результаты запроса будут возвращены в виде одного перечисляемого объекта. Если используется метод AsPages()
, результаты запроса будут возвращены в виде последовательности страниц, каждая из которых содержит подмножество результатов запроса. В этом случае количество сделанных запросов будет зависеть от размера каждой страницы и общего количества результатов, соответствующих критериям запроса.
Что, если я использую Query<T> без метода AsPages
В C#, если вы используете Query<T>
без метода AsPages, вы получите все результаты запроса в одном пакете.
Метод Query<T>
возвращает IEnumerable, представляющий результаты запроса. Если вы не используете AsPages, весь набор результатов будет загружен в память сразу. Это приводит к высокому использованию памяти, и производительность может снизиться, так как она может потреблять много памяти.
Метод AsPages также позволяет более эффективно извлекать результаты. Это позволяет извлекать результаты небольшими партиями или страницами, что может помочь сократить использование памяти и повысить производительность. Метод AsPages возвращает IAsyncEnumerable<Page<T>>
, где каждая страница представляет собой страницу результатов.
Query() возвращает Pageble< T >, но делает ли он снова 10 запросов к таблице или берет все элементы до тех пор, пока не переполнится память (по умолчанию 4 МБ), или берет все элементы сразу?
Поведение Query() зависит от реализации метода и базовой системы базы данных.
когда вы выполняете запрос, который возвращает результат, доступный для страниц, база данных выполнит запрос и вернет приложению только подмножество результатов в зависимости от размера страницы и текущего номера страницы. Остальные результаты извлекаются при последующих запросах следующих страниц.
Поэтому, если вы вызовете Query<Domain>()
с определенным размером страницы, будет получено только количество элементов, указанное для этого размера страницы, а не все элементы в таблице.
Количество запросов к таблице будет зависеть от количества страниц, которые необходимо извлечь, чтобы вернуть все результаты запроса.
Память, используемая для хранения извлеченных результатов, будет зависеть от размера извлеченных объектов и количества извлеченных объектов на каждой странице. При использовании выводимых на страницы результатов размер возвращаемых объектов обычно ограничен для уменьшения использования памяти, поэтому маловероятно, что использование памяти превысит предел по умолчанию в 4 МБ.
Для получения дополнительной информации см. Объекты таблицы запросов и SO Thread.
Когда вы вызываете tableclient.Query<Domain>() в хранилище таблиц Azure, он возвращает все сущности, соответствующие запросу, с учетом некоторых ограничений на количество сущностей, возвращаемых на запрос, и общий размер ответа.
Метод Query будет возвращать до 1000 сущностей в одном ответе, и если имеется более 1000 сущностей, соответствующих запросу, он вернет токен продолжения, который можно использовать для получения следующего пакета сущностей. Это означает, что если в вашей таблице более 1000 сущностей, вам нужно будет сделать несколько запросов, чтобы получить все сущности, соответствующие вашему запросу.
И важно отметить, что использование меньшего размера страницы может повысить производительность за счет уменьшения объема данных, передаваемых по сети, но также может увеличить количество запросов, необходимых для извлечения всех сущностей, соответствующих запросу. Таким образом, вы должны выбрать размер страницы, который уравновешивает производительность и количество запросов, необходимых для получения всех необходимых вам сущностей.
Итак, если я правильно понимаю,
tableclient.Query<Domain>()
вернет все объекты из лазурной таблицы, независимо от того, сколько объектов (например, 5000). Но это может создать проблему: высокое использование памяти и производительность. Но вернет ли он все сущности? Если я используюtableclient.Query<Domain>(maxPerPage: 500)
, он сделает только один запрос и вернет только первые 500 элементов. (Никаких 10 страниц по 500 энинов каждая). И если я используюtableclient.Query<Domain>().AsPages()
, он вернет все объекты в виде страниц - 5 страниц по 1000 объектов на каждой? (если я использую значения по умолчанию)?