簡體   English   中英

從 Azure 表存儲中檢索 1+ 百萬條記錄

[英]Retrieve 1+ million records from Azure Table Storage

我的表存儲有大約 1-2 百萬條記錄,我有一項日常工作需要檢索所有沒有屬性 A 的記錄並做一些進一步的處理。

預計大約有 1 - 150 萬條記錄沒有屬性 A。我知道有兩種方法。

  1. 查詢所有記錄,然后過濾結果
  2. 進行表掃描

目前,它使用我們在c#中查詢所有記錄並過濾的方法。 但是,該任務正在 Azure Function App 中運行。 檢索所有結果的查詢有時需要超過 10 分鍾,這是 Azure Functions 的限制。

我試圖了解為什么檢索 100 萬條記錄需要這么長時間以及如何優化查詢。 表的現有設計是分區和行鍵是相同的並且是一個 guid - 這讓我相信每個分區有一個實體。

查看 Microsoft 文檔,這里有一些關鍵的表存儲限制( https://docs.microsoft.com/en-us/azure/storage/common/storage-scalability-targets#azure-table-storage-scale-targets ):

  • 每個存儲帳戶的最大請求率:每秒 20,000 個事務,假設實體大小為 1-KiB
  • 單個表分區(1 KiB 實體)的目標吞吐量:每秒最多 2,000 個實體。

我最初的猜測是我應該使用另一個分區鍵對每個分區 2,000 個實體進行分組,以實現每個分區每秒 2,000 個的目標吞吐量。 這是否意味着理論上可以在 1 秒內返回 2,000,000 條記錄?

任何想法或建議表示贊賞。

我在寫博客后發現了這個問題。 我有一個項目,我在其中使用 Azure Functions Consumption 計划並有一個很大的 Azure 存儲表(350 萬條記錄)。

這是我的博客文章: https : //www.joelverhagen.com/blog/2020/12/distributed-scan-of-azure-tables

我在這篇博文中提到了幾個選項,但我認為最快的是將“表掃描”工作分配到更小的工作項目中,這些工作項目可以在 10 分鍾的限制內輕松完成。 如果您想嘗試一下,我在博客文章中鏈接了一個實現。 可能需要適應您的 Azure 函數,但大部分聰明的部分(找到分區鍵范圍)都已實現和測試。

這看起來本質上就是user3603467在他的回答中所建議的。

我看到兩種在批處理中檢索 1+ 條記錄的方法,其中結果必須保存到單個媒體 - 就像一個文件。

首先)您標識/選擇相關數據的所有主 ID/鍵。 然后,您使用這些主要 id/key 的塊生成並行作業,您可以在其中讀取實際數據並對其進行處理。 然后每個作業將結果報告給單個媒體。

第二)您標識/選擇(更新)相關數據的前 n 個,並將這些數據標記為正在處理的狀態。 在這里使用並發鎖定,這應該可以防止其他人在並行完成時獲取該數據。

如果可能,我會選擇第一個解決方案,因為它是最簡單、最干凈的解決方案。 如果您使用“選擇更新”,則第二種解決方案是最好的,我不知道 Azure 表存儲是否支持它。

您需要對任務進行Paralise。 由於您不知道分區鍵,因此運行 24 個單獨的查詢 PK,這些查詢以字母表的每個字母開始和結束。 寫一個查詢 where PK > A && PK < B, and > B < C etc. 然后在內存中加入 24 個結果。 在單個功能中超級容易做到。 在 JS 中只需使用 Promise.all([])。

暫無
暫無

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

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