DynamoDB - Quét

Thao tác quét đọc tất cả các mục trong bảng hoặc chỉ số phụ. Chức năng mặc định của nó dẫn đến việc trả về tất cả các thuộc tính dữ liệu của tất cả các mục trong một chỉ mục hoặc bảng. Sử dụngProjectionExpression trong các thuộc tính lọc.

Mỗi lần quét trả về một tập hợp kết quả, ngay cả khi không tìm thấy kết quả nào phù hợp, dẫn đến một tập hợp trống. Các bản quét truy xuất không quá 1MB, với tùy chọn lọc dữ liệu.

Note - Các tham số và bộ lọc của quét cũng áp dụng cho truy vấn.

Các loại hoạt động quét

Filtering- Các hoạt động quét cung cấp khả năng lọc tốt thông qua các biểu thức bộ lọc, giúp sửa đổi dữ liệu sau khi quét hoặc truy vấn; trước khi trả kết quả. Các biểu thức sử dụng các toán tử so sánh. Cú pháp của chúng giống với các biểu thức điều kiện ngoại trừ các thuộc tính khóa mà các biểu thức lọc không cho phép. Bạn không thể sử dụng phân vùng hoặc khóa sắp xếp trong biểu thức bộ lọc.

Note - Giới hạn 1MB được áp dụng trước bất kỳ ứng dụng lọc nào.

Throughput Specifications- Quét tiêu thụ thông lượng, tuy nhiên, tiêu thụ tập trung vào kích thước mặt hàng hơn là dữ liệu trả về. Mức tiêu thụ vẫn giữ nguyên cho dù bạn yêu cầu mọi thuộc tính hay chỉ một số thuộc tính và việc sử dụng hay không sử dụng biểu thức bộ lọc cũng không ảnh hưởng đến mức tiêu thụ.

Pagination- DynamoDB phân trang kết quả gây chia kết quả thành các trang cụ thể. Giới hạn 1MB áp dụng cho các kết quả trả về và khi bạn vượt quá giới hạn này, cần phải quét một lần nữa để thu thập phần còn lại của dữ liệu. CácLastEvaluatedKeygiá trị cho phép bạn thực hiện quét tiếp theo này. Chỉ cần áp dụng giá trị choExclusiveStartkey. Khi màLastEvaluatedKeygiá trị trở thành null, hoạt động đã hoàn thành tất cả các trang dữ liệu. Tuy nhiên, giá trị không rỗng không tự động có nghĩa là còn nhiều dữ liệu hơn. Chỉ một giá trị null cho biết trạng thái.

The Limit Parameter- Tham số giới hạn quản lý kích thước kết quả. DynamoDB sử dụng nó để thiết lập số lượng mục cần xử lý trước khi trả về dữ liệu và không hoạt động bên ngoài phạm vi. Nếu bạn đặt giá trị x, DynamoDB sẽ trả về x đầu tiên các mục phù hợp.

Giá trị LastEvalishedKey cũng áp dụng trong trường hợp các tham số giới hạn mang lại kết quả từng phần. Sử dụng nó để hoàn thành quá trình quét.

Result Count - Phản hồi cho các truy vấn và quét cũng bao gồm thông tin liên quan đến ScannedCountvà Đếm, định lượng các mục được quét / truy vấn và định lượng các mục được trả lại. Nếu bạn không lọc, giá trị của chúng giống hệt nhau. Khi bạn vượt quá 1MB, số lượng chỉ thể hiện phần được xử lý.

Consistency- Kết quả truy vấn và kết quả quét cuối cùng là các lần đọc nhất quán, tuy nhiên, bạn cũng có thể đặt các lần đọc nhất quán mạnh mẽ. Sử dụngConsistentRead để thay đổi cài đặt này.

Note - Cài đặt đọc nhất quán tác động đến mức tiêu thụ bằng cách sử dụng gấp đôi đơn vị công suất khi được đặt thành nhất quán mạnh.

Performance- Các truy vấn cung cấp hiệu suất tốt hơn so với quét do quét thu thập dữ liệu toàn bộ bảng hoặc chỉ mục phụ, dẫn đến phản hồi chậm và tiêu tốn nhiều thông lượng. Quét hoạt động tốt nhất đối với các bảng nhỏ và tìm kiếm với ít bộ lọc hơn, tuy nhiên, bạn có thể thiết kế quét tinh gọn bằng cách tuân thủ một số phương pháp hay nhất như tránh hoạt động đọc đột ngột, tăng tốc và khai thác quét song song.

Một truy vấn tìm một dải khóa nhất định thỏa mãn một điều kiện nhất định, với hiệu suất được quyết định bởi lượng dữ liệu mà nó truy xuất thay vì khối lượng khóa. Các thông số của hoạt động và số lượng trận đấu ảnh hưởng cụ thể đến hiệu suất.

Quét song song

Các hoạt động quét thực hiện xử lý tuần tự theo mặc định. Sau đó, chúng trả về dữ liệu ở các phần 1MB, điều này sẽ nhắc ứng dụng tìm nạp phần tiếp theo. Điều này dẫn đến việc quét lâu cho các bảng và chỉ số lớn.

Đặc điểm này cũng có nghĩa là các bản quét có thể không phải lúc nào cũng khai thác đầy đủ thông lượng khả dụng. DynamoDB phân phối dữ liệu bảng trên nhiều phân vùng; và thông lượng quét vẫn bị giới hạn ở một phân vùng duy nhất do hoạt động của phân vùng đơn.

Một giải pháp cho vấn đề này đến từ việc phân chia các bảng hoặc chỉ số thành các phân đoạn một cách hợp lý. Sau đó, "công nhân" quét các phân đoạn song song (đồng thời). Nó sử dụng các tham số của Phân đoạn vàTotalSegments để chỉ định các phân đoạn được quét bởi một số công nhân nhất định và chỉ định tổng số lượng phân đoạn được xử lý.

Số công nhân

Bạn phải thử nghiệm với các giá trị worker (Tham số phân đoạn) để đạt được hiệu suất ứng dụng tốt nhất.

Note- Quét song song với nhiều nhóm công nhân tác động đến thông lượng bằng cách có thể tiêu thụ tất cả thông lượng. Quản lý vấn đề này bằng tham số Giới hạn, bạn có thể sử dụng tham số này để ngăn một nhân viên tiêu thụ tất cả thông lượng.

Sau đây là một ví dụ quét sâu.

Note- Chương trình sau có thể giả sử một nguồn dữ liệu đã tạo trước đó. Trước khi cố gắng thực thi, hãy thu thập các thư viện hỗ trợ và tạo các nguồn dữ liệu cần thiết (các bảng có các đặc điểm bắt buộc hoặc các nguồn tham chiếu khác).

Ví dụ này cũng sử dụng Eclipse IDE, tệp thông tin đăng nhập AWS và Bộ công cụ AWS trong Dự án Java AWS của Eclipse.

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()); 
      }     
   } 
}