簡體   English   中英

使用 CosmosDB 跨分區查詢批量操作的最有效方法

[英]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 個線程來對返回的每一行執行我的操作,所以我先處理jampickles然后是cookiessweets因此當我對jampickles執行操作時,會消耗第 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.

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