簡體   English   中英

從 Azure Cosmos DB 集合中下載/選擇*所有*文檔的最快方法是什么

[英]What's the fastest way to download/select *all* documents from an Azure Cosmos DB collection

我有超過 1000 萬條記錄的集合,需要盡快將它們全部加載到 memory 中。有沒有比使用查詢迭代器更快的方法?

這是我當前的代碼,我分配了 40,000 RU,但是當我運行我的代碼時它似乎沒有使用所有可用的 RU。

using var queryIterator = container.GetItemQueryIterator<Customer>("select * from c");

var records = new Dictionary<string,Customer>();

while (queryIterator.HasMoreResults)
{
    var response = await queryIterator.ReadNextAsync().ConfigureAwait(false);
     foreach (var customer in response.Resource)
     {
          records.Add(customer.Id, customer);
     }
}

上面的代碼有效,但需要很長時間,我發現我的 RU 使用率僅占分配的 <10%。

我文檔的分區鍵是 id,所以所有文檔都在自己的分區中。 這會是讀取性能慢的原因嗎? 有沒有辦法加快速度?

我嘗試使用 QueryRequestOptions 增加頁面大小

var options = new QueryRequestOptions { MaxItemCount = 10000 };

但這並沒有太大的區別。 我認為即使我將它設置得更高,它也最多可以達到每頁 5000 個奇數文檔。

我是否應該並行運行多個查詢,因為我有 RU 余量?

沒有確切的答案,因為它實際上取決於您的應用程序和資源。

您可以通過將MaxConcurrency設置為計算值或-1來微調並發性。 參考: https://learn.microsoft.com/azure/cosmos-db/nosql/performance-tips-query-sdk?tabs=v3&pivots=programming-language-csharp#tune-the-degree-of-parallelism

您已經在增加頁面大小,您可以微調MaxBufferedItemCount 參考: https://learn.microsoft.com/en-us/azure/cosmos-db/nosql/performance-tips-query-sdk?tabs=v3&pivots=programming-language-csharp#tune-the-buffer-size

還要記住,這取決於您對響應的處理方式,在您的情況下,您只是將它們放入字典中,但是如果您將它們放入一個已經可以開始使用它們的結構中(如 PubSub 系統),那會怎么樣,當您獲取更多頁面時,使用結果的進程可以開始工作。

最后,您甚至可以將其分布在多台機器上。 使用FeedRange

IReadOnlyList<FeedRange> feedRanges = await container.GetFeedRanges();

// You can distribute each feedRange to a separate compute through feedRange.ToJsonString() and feedRange.FromJsonString()
// or start concurrent Tasks one per FeedRange if the machine is big enough

// per FeedRange, you can do:
using var queryIterator = container.GetItemQueryIterator<Customer>(feedRange, new QueryDefinition("select * from c"));

var records = new Dictionary<string,Customer>();

while (queryIterator.HasMoreResults)
{
    var response = await queryIterator.ReadNextAsync().ConfigureAwait(false);
     foreach (var customer in response.Resource)
     {
          records.Add(customer.Id, customer);
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM