查詢和掃描資料的最佳實務 - Amazon DynamoDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

查詢和掃描資料的最佳實務

本節涵蓋使用QueryScan操作。

掃描的效能考量

一般而言,Scan作業效率低於 DynamoDB 中的其他作業。AScan作業會一律掃描整個資料表或次要索引。然後它過濾掉值以提供您想要的結果,實質上添加從結果集中刪除數據的額外步驟。

如果可能的話,您應該避免在Scan作業,並使用移除許多結果的篩選器。此外,隨著資料表或索引的增長,Scan作業會變慢。所以此Scan作業會檢查每個項目的要求值,並且可能會在單一作業中耗用大型資料表或索引的佈建輸送量。為了更快速的回應時間,請設計表格和索引,讓您的應用程式可以使用Query,而不是Scan。(對於表格,您也可以考慮使用GetItemBatchGetItemAPI。)

或者,設計您的應用程序以使用Scan作業,以最大限度地減少對請求率的影響。

避免讀取活動中的突然尖峰

建立表格時,您可以設定其讀取和寫入容量單位需求。對於讀取,容量單位會以每秒強烈一致的 4 KB 資料讀取要求數來表示。對於最終一致性讀取,讀取容量單位為每秒兩個 4 KB 讀取要求。AScan作業預設會執行最後一致的讀取,而且最多可傳回 1 MB (一頁) 的資料。因此,單一Scan要求可能會消耗 (1 MB 頁面大小/4 KB 項目大小)/2 (最終一致性讀取) = 128 個讀取作業。如果您要求強制一致性讀取,Scan作業會耗用兩倍的佈建輸送量 — 256 個讀取作業。

與表格設定的讀取容量相比,這代表使用率突然增加。此掃描使用容量單位可防止同一表格的其他可能更重要的要求使用可用容量單位。因此,您可能會得到ProvisionedThroughputExceeded例外狀況。

問題不僅僅是容量單位的突然增加Scan使用。掃描也可能會耗用相同磁碟分割的所有容量單位,因為掃描要求讀取磁碟分割上彼此相鄰的項目。這表示要求正在點擊相同的磁碟分割,造成其所有容量單位被消耗,並節流到該磁碟分割的其他要求。如果讀取資料的要求分散在多個磁碟分割,則作業不會節流特定磁碟分割。

下圖說明容量單位使用量突然激增的影響,QueryScan操作以及其對同一表的其他請求的影響。


        4 種不同案例,在表格上顯示佈建的輸送量間隔、要求以及良好和不良結果。

如此處所示,使用量尖峰會以數種方式影響表格的佈建輸送量:

  1. 好:甚至分配請求和大小

  2. 不太好:頻繁要求突發

  3. 錯誤:幾個隨機的大請求

  4. 錯誤:大型掃描作業

而不是使用大型Scan作業,您可以使用下列技術,將該作業對資料表佈建輸送量的影響降至最低。

  • 縮減頁面大小

    由於掃描作業會讀取整個頁面 (預設為 1 MB),因此您可以設定較小的頁面大小來降低掃描作業的影響。所以此Scan操作提供了限制參數,您可以使用它來設置請求的頁面大小。EACHQueryScan要求使用較少的讀取作業,並在每個要求之間建立「暫停」。例如,假設每個項目是 4 KB,而且您將頁面大小設定為 40 個項目。AQuery請求將僅消耗 20 個最終一致的讀取操作或 40 個強烈一致的讀取操作。較大的數量較小QueryScan操作將允許您的其他關鍵請求在不節流的情況下成功。

  • 隔離掃描作業

    DynamoDB 專為輕鬆擴充性而設計。因此,應用程式可以為不同的目的建立資料表,甚至可能會跨多個資料表複製內容。您想要在未採用「關鍵任務」流量的資料表上執行掃描。某些應用程式會在兩個資料表之間每小時旋轉流量來處理此負載,一個用於重要流量,另一個用於簿記。其他應用程式可以在兩個資料表上執行每次寫入:「關鍵任務」資料表和「陰影」資料表。

將您的應用程式設定為重試任何接收回應代碼的要求,表示您已超過佈建的輸送量。或者,使用UpdateTableoperation. 如果您的工作負載有暫時尖峰,導致輸送量偶爾超出佈建層級,請以指數退回重試要求。如需關於建置指數退回的詳細資訊,請參閱錯誤重試和指數退避

利用平行掃描

許多應用程序可以從使用並行Scan作業,而不是循序掃描。例如,處理大型歷史資料表的應用程式,執行平行掃描的速度會比連續掃描的速度要快得多。背景「掃描程式」處理序中的多個工作者執行緒可以以低優先順序掃描資料表,而不會影響生產流量。在每個這些例子中,並行Scan的使用方式使其不會飢餓佈建的輸送量資源的其他應用程式。

雖然平行掃描可能很有幫助,但它們可能會對佈建的輸送量造成大量需求。使用平行掃描時,您的應用程式有多個工作者都在執行Scan並行運算。這可以快速消耗該資料表的佈建讀取容量。在該情況下,其他需要存取該資料表的應用程式可能會受到限制。

如果符合下列條件,則平行掃描可能是正確的選擇:

  • 表格大小為 20 GB 或更大。

  • 未完全使用該資料表的佈建讀取輸送量。

  • 循序Scan操作太慢。

選擇總區段

最佳設定TotalSegments取決於您的特定資料、表格的佈建輸送量設定,以及您的效能需求。你可能需要實驗才能正確。我們建議您從簡單的比率開始,例如每 2 GB 資料一個區段。例如,對於 30 GB 的資料表,您可以將TotalSegments設定為 15 個 (30 GB/2 GB)。然後,您的應用程序將使用 15 個工作人員,每個工作人員掃描不同的段。

您也可以在TotalSegments,這是基於客戶端資源的。您可以設定TotalSegments設定為 1 到 1000000 之間的任何數字,而 DynamoDB 則可讓您掃描該數目的區段。例如,如果您的客戶端限制可以同時運行的線程數量,則可以逐漸增加TotalSegments直到您取得最佳Scan效能與您的應用程式。

監控平行掃描,以最佳化佈建的輸送量使用情況,同時確保其他應用程式不會耗盡資源。增加TotalSegments如果您沒有消耗所有佈建的吞吐量,但仍然在Scan請求。減少TotalSegments如果Scan要求所耗用的佈建輸送量超過您想要使用的量。