
- DynamoDB 教程
- DynamoDB - 首頁
- DynamoDB - 概述
- DynamoDB - 基本概念
- DynamoDB - 環境
- DynamoDB - 操作工具
- DynamoDB - 資料型別
- DynamoDB - 建立表
- DynamoDB - 載入表
- DynamoDB - 查詢表
- DynamoDB - 刪除表
- DynamoDB - API 介面
- DynamoDB - 建立專案
- DynamoDB - 獲取專案
- DynamoDB - 更新專案
- DynamoDB - 刪除專案
- DynamoDB - 批次寫入
- DynamoDB - 批次檢索
- DynamoDB - 查詢
- DynamoDB - 掃描
- DynamoDB - 索引
- 全域性二級索引
- 區域性二級索引
- DynamoDB - 聚合
- DynamoDB - 訪問控制
- DynamoDB - 許可權 API
- DynamoDB - 條件
- Web 身份聯合
- DynamoDB - 資料管道
- DynamoDB - 資料備份
- DynamoDB - 監控
- DynamoDB - CloudTrail
- DynamoDB - MapReduce
- DynamoDB - 表活動
- DynamoDB - 錯誤處理
- DynamoDB - 最佳實踐
- DynamoDB 有用資源
- DynamoDB - 快速指南
- DynamoDB - 有用資源
- DynamoDB - 討論
DynamoDB - 掃描
掃描操作讀取所有表項或二級索引。其預設功能會返回索引或表中所有專案的所有資料屬性。使用ProjectionExpression引數過濾屬性。
每次掃描都會返回一個結果集,即使沒有找到匹配項,也會返回一個空集。掃描最多檢索 1MB 資料,並可以選擇過濾資料。
注意 - 掃描的引數和過濾也適用於查詢。
掃描操作型別
過濾 - 掃描操作透過過濾器表示式提供精細過濾,這些表示式在掃描或查詢之後修改資料;在返回結果之前。表示式使用比較運算子。它們的語法類似於條件表示式,但例外的是鍵屬性,過濾器表示式不允許使用鍵屬性。您不能在過濾器表示式中使用分割槽鍵或排序鍵。
注意 - 1MB 的限制適用於應用任何過濾之前。
吞吐量規格 - 掃描會消耗吞吐量,但是,消耗重點在於專案大小而不是返回的資料。無論您請求所有屬性還是僅請求少量屬性,消耗量都保持不變,使用或不使用過濾器表示式也不會影響消耗量。
分頁 - DynamoDB 將結果分頁,將結果劃分為特定的頁面。1MB 的限制適用於返回的結果,當您超過此限制時,需要進行另一次掃描才能收集其餘資料。LastEvaluatedKey值允許您執行此後續掃描。只需將該值應用於ExclusiveStartkey。當LastEvaluatedKey值變為 null 時,操作已完成所有資料頁面。但是,非 null 值並不一定意味著還有更多資料。只有 null 值才表示狀態。
Limit 引數 - Limit 引數管理結果大小。DynamoDB 使用它來確定在返回資料之前要處理的專案數量,並且不超出範圍工作。如果您設定 x 值,DynamoDB 將返回前 x 個匹配項。
Limit 引數產生部分結果的情況下,LastEvaluatedKey 值也適用。使用它來完成掃描。
結果計數 - 查詢和掃描的響應還包括與ScannedCount和 Count 相關的資訊,它們分別量化掃描/查詢的專案和返回的專案。如果您不進行過濾,則它們的值相同。當您超過 1MB 時,計數僅代表已處理的部分。
一致性 - 查詢結果和掃描結果是最終一致的讀取,但是,您也可以設定強一致的讀取。使用ConsistentRead引數更改此設定。
注意 - 強一致的讀取設定會影響消耗,因為在設定為強一致時會使用雙倍的容量單元。
效能 - 查詢比掃描具有更好的效能,因為掃描會爬取整個表或二級索引,導致響應緩慢且吞吐量消耗很大。掃描最適合小型表和過濾器較少的搜尋,但是,您可以透過遵守一些最佳實踐來設計精簡的掃描,例如避免突然加速的讀取活動並利用並行掃描。
查詢查詢滿足給定條件的特定鍵範圍,其效能取決於它檢索的資料量,而不是鍵的數量。操作的引數和匹配項的數量會特別影響效能。
並行掃描
掃描操作預設情況下順序執行處理。然後它們以 1MB 的部分返回資料,這會提示應用程式獲取下一部分。對於大型表和索引,這會導致長時間掃描。
此特性還意味著掃描可能並不總是能夠充分利用可用的吞吐量。DynamoDB 將表資料分佈在多個分割槽中;由於其單分割槽操作,掃描吞吐量仍然限制在一個分割槽中。
解決此問題的方法是從邏輯上將表或索引劃分為多個段。然後,“工作器”並行(併發)掃描段。它使用 Segment 和TotalSegments引數來指定某些工作器掃描的段以及指定處理的段的總數量。
工作器數量
您必須試驗工作器值(Segment 引數)以獲得最佳應用程式效能。
注意 - 具有大量工作器的並行掃描會影響吞吐量,因為它可能會消耗所有吞吐量。使用 Limit 引數管理此問題,您可以使用它來阻止單個工作器消耗所有吞吐量。
以下是深度掃描示例。
注意 - 下面的程式可能假設存在預先建立的資料來源。在嘗試執行之前,請獲取支援庫並建立必要的資料來源(具有所需特徵的表或其他引用的源)。
此示例還使用 Eclipse IDE、AWS 憑證檔案以及 Eclipse AWS Java 專案中的 AWS 工具包。
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.document.DynamoDB; import com.amazonaws.services.dynamodbv2.document.Item; import com.amazonaws.services.dynamodbv2.document.ItemCollection; import com.amazonaws.services.dynamodbv2.document.ScanOutcome; import com.amazonaws.services.dynamodbv2.document.Table; public class ScanOpSample { static DynamoDB dynamoDB = new DynamoDB( new AmazonDynamoDBClient(new ProfileCredentialsProvider())); static String tableName = "ProductList"; public static void main(String[] args) throws Exception { findProductsUnderOneHun(); //finds products under 100 dollars } private static void findProductsUnderOneHun() { Table table = dynamoDB.getTable(tableName); Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); expressionAttributeValues.put(":pr", 100); ItemCollection<ScanOutcome> items = table.scan ( "Price < :pr", //FilterExpression "ID, Nomenclature, ProductCategory, Price", //ProjectionExpression null, //No ExpressionAttributeNames expressionAttributeValues); System.out.println("Scanned " + tableName + " to find items under $100."); Iterator<Item> iterator = items.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next().toJSONPretty()); } } }