![](/img/trans.png)
[英]What is the most efficient way to copy a CosmosDB collection and retain the order of items by physical partition?
[英]Most efficient way to query across partition with CosmosDB for bulk operations
我有一個跨分區查詢,它依次返回每個分區的行,這是有道理的,分區 1 的所有結果,分區 2 的所有結果等等。
對於返回的每一行,我需要執行一個操作,可能是刪除或更新。
記錄太多,無法全部讀取然后執行操作,因此我需要流式傳輸結果並同時執行操作。
我得到的問題是我很快用完了 RU,因為我的操作依次在每個分區上運行,並且單個分區分配了十分之一的 RU。
我可以在FeedOptions
指定一個PartitionKey
但這對我沒有幫助,因為我不知道密鑰是什么。
我的查詢看起來像
select r.* from r where r.deleted
該partition
位於名為container
的字段上
想象一下我有以下物品
container|title |deleted
jamjar |jam |true <--- stored in partition 5
jar |pickles |true <--- stored in partition 5
tin |cookies |true <--- stored in partition 8
tub |sweets |true <--- stored in partition 9
我select r.title from r where r.deleted
我的查詢將按以下順序返回行
jam <--- stored in partition 5
pickles <--- stored in partition 5
cookies <--- stored in partition 8
sweets <--- stored in partition 9
我使用ActionBlock
允許我啟動 2 個線程來對返回的每一行執行我的操作,所以我先處理jam
和pickles
然后是cookies
和sweets
因此當我對jam
和pickles
執行操作時,會消耗第 5 部分的 RU
我希望結果返回為:
jam <--- stored in partition 5
cookies <--- stored in partition 8
sweets <--- stored in partition 9
pickles <--- stored in partition 5
對於普通的 API 調用,我們總是知道container
,這是批量和非常不頻繁的刪除的要求。
如果知道分區數並且可以為查詢提供分區號就可以了,我很樂意發出 10 個查詢並將其視為 10 個單獨的作業。
您需要設置MaxDegreeOfParallelism
這是一部分FeedOptions
:
FeedOptions queryOptions = new FeedOptions
{
EnableCrossPartitionQuery = true,
MaxDegreeOfParallelism = 10,
};
它將為每個分區創建一個客戶端線程,如果您檢查 HTTP 標頭,您可以看到發生了什么
x-ms-documentdb-query-enablecrosspartition: True
x-ms-documentdb-query-parallelizecrosspartitionquery: True
x-ms-documentdb-populatequerymetrics: False
x-ms-documentdb-partitionkeyrangeid: QQlvANNcKgA=,3
注意QQlvANNcKgA=,3你看到其中的 10 個,從,0到,9我懷疑第一部分是一些頁面跟蹤,第二部分是分區
請參閱文檔並行查詢執行
這是 Fiddler 中 3 個查詢的時間線視圖:
MaxDegreeOfParallelism = 10
:速度較慢且不太並行,同時線程和連接被加速(您可以在左側列表中看到 5 個額外的 SSL 握手,並且在“綠色”設置的最后 5 個請求之前的間隙時間線)。 還有 2 個(出於某種原因)請求獲取集合的 PK 范圍MaxDegreeOfParallelism = 10
(再次):幾乎最佳並行。 PK 范圍信息似乎是從前一個請求中緩存的,並在此處重用,而沒有發出任何無關的請求。MaxDegreeOfParallelism = 0
:完全順序。x-ms-documentdb-partitionkeyrangeid
標頭。使用 DocumentClient v2.x 對具有6 個物理分區的集合運行查詢。
另請注意,每個查詢都會觸發 7 個請求,第一個是“查詢計划請求”(不可並行化),而以下 6 個請求返回實際數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.