DynamoDB - สแกน

Scan Operations อ่านรายการตารางหรือดัชนีรองทั้งหมด ฟังก์ชันเริ่มต้นส่งคืนแอตทริบิวต์ข้อมูลทั้งหมดของรายการทั้งหมดภายในดัชนีหรือตาราง จ้างProjectionExpression พารามิเตอร์ในการกรองแอตทริบิวต์

การสแกนทุกครั้งจะส่งคืนชุดผลลัพธ์แม้ว่าจะไม่พบรายการที่ตรงกันก็ตามซึ่งส่งผลให้ชุดว่างเปล่า สแกนดึงข้อมูลไม่เกิน 1MB พร้อมตัวเลือกในการกรองข้อมูล

Note - พารามิเตอร์และการกรองการสแกนยังใช้กับการสืบค้น

ประเภทของการสแกน

Filtering- การดำเนินการสแกนเสนอการกรองอย่างละเอียดผ่านนิพจน์ตัวกรองซึ่งจะแก้ไขข้อมูลหลังจากการสแกนหรือการสืบค้น ก่อนส่งคืนผลลัพธ์ นิพจน์ใช้ตัวดำเนินการเปรียบเทียบ ไวยากรณ์ของพวกเขาคล้ายกับนิพจน์เงื่อนไขยกเว้นคีย์แอ็ตทริบิวต์ซึ่งนิพจน์ตัวกรองไม่อนุญาต คุณไม่สามารถใช้พาร์ติชันหรือคีย์การเรียงลำดับในนิพจน์ตัวกรอง

Note - ขีด จำกัด 1MB ใช้ก่อนการใช้งานการกรองใด ๆ

Throughput Specifications- การสแกนจะใช้ปริมาณงานอย่างไรก็ตามการบริโภคจะเน้นที่ขนาดรายการมากกว่าข้อมูลที่ส่งคืน ปริมาณการใช้ยังคงเหมือนเดิมไม่ว่าคุณจะร้องขอทุกแอตทริบิวต์หรือเพียงไม่กี่รายการและการใช้หรือไม่ใช้นิพจน์ตัวกรองก็ไม่ส่งผลต่อการบริโภค

Pagination- DynamoDB จะแบ่งหน้าผลลัพธ์ที่ทำให้เกิดการแบ่งผลลัพธ์ออกเป็นหน้าเฉพาะ ขีด จำกัด 1MB ใช้กับผลลัพธ์ที่ส่งคืนและเมื่อคุณทำเกินการสแกนอีกครั้งจะมีความจำเป็นเพื่อรวบรวมข้อมูลที่เหลือ LastEvaluatedKeyค่าช่วยให้คุณทำการสแกนในภายหลังนี้ เพียงใช้ค่ากับไฟล์ExclusiveStartkey. เมื่อLastEvaluatedKeyค่ากลายเป็นโมฆะการดำเนินการเสร็จสิ้นทุกหน้าของข้อมูล อย่างไรก็ตามค่าที่ไม่ใช่ค่าว่างไม่ได้หมายความว่าจะมีข้อมูลเหลืออยู่โดยอัตโนมัติ เฉพาะค่า null เท่านั้นที่ระบุสถานะ

The Limit Parameter- พารามิเตอร์ขีด จำกัด จัดการขนาดผลลัพธ์ DynamoDB ใช้เพื่อสร้างจำนวนรายการที่จะประมวลผลก่อนส่งคืนข้อมูลและไม่ทำงานนอกขอบเขต หากคุณตั้งค่าเป็น x DynamoDB จะส่งคืนค่า x รายการแรกที่ตรงกัน

ค่า LastEvaluatedKey ยังใช้ในกรณีของพารามิเตอร์ จำกัด ที่ให้ผลลัพธ์บางส่วน ใช้เพื่อทำการสแกนให้เสร็จสมบูรณ์

Result Count - การตอบคำถามและการสแกนรวมถึงข้อมูลที่เกี่ยวข้องด้วย ScannedCountและนับซึ่งจะหาจำนวนรายการที่สแกน / สอบถามและหาจำนวนรายการที่ส่งคืน หากคุณไม่กรองค่าจะเหมือนกัน เมื่อคุณเกิน 1MB จำนวนนับจะแสดงเฉพาะส่วนที่ประมวลผล

Consistency- ผลลัพธ์การค้นหาและผลการสแกนจะเป็นการอ่านที่สอดคล้องกันในที่สุดอย่างไรก็ตามคุณสามารถตั้งค่าการอ่านที่สอดคล้องกันอย่างมากได้เช่นกัน ใช้ConsistentRead พารามิเตอร์เพื่อเปลี่ยนการตั้งค่านี้

Note - การตั้งค่าการอ่านที่สม่ำเสมอส่งผลกระทบต่อการบริโภคโดยใช้หน่วยความจุสองเท่าเมื่อตั้งค่าให้สอดคล้องกันอย่างมาก

Performance- ข้อความค้นหาให้ประสิทธิภาพที่ดีกว่าการสแกนเนื่องจากการสแกนรวบรวมข้อมูลตารางเต็มหรือดัชนีรองส่งผลให้การตอบสนองช้าและปริมาณการใช้งานที่หนักหน่วง การสแกนจะทำงานได้ดีที่สุดสำหรับตารางขนาดเล็กและการค้นหาที่มีตัวกรองน้อยอย่างไรก็ตามคุณสามารถออกแบบการสแกนแบบลีนได้โดยปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดบางประการเช่นหลีกเลี่ยงกิจกรรมการอ่านแบบเร่งด่วนและการใช้ประโยชน์จากการสแกนคู่ขนาน

แบบสอบถามพบช่วงของคีย์ที่ตรงตามเงื่อนไขที่กำหนดโดยมีประสิทธิภาพที่กำหนดโดยจำนวนข้อมูลที่ดึงมาแทนที่จะเป็นปริมาณของคีย์ พารามิเตอร์ของการดำเนินการและจำนวนที่ตรงกันส่งผลต่อประสิทธิภาพโดยเฉพาะ

การสแกนแบบขนาน

การสแกนดำเนินการประมวลผลตามลำดับตามค่าเริ่มต้น จากนั้นจะส่งคืนข้อมูลในส่วน 1MB ซึ่งจะแจ้งให้แอปพลิเคชันดึงข้อมูลส่วนถัดไป ซึ่งส่งผลให้มีการสแกนตารางและดัชนีขนาดใหญ่เป็นเวลานาน

คุณลักษณะนี้ยังหมายความว่าการสแกนอาจไม่ได้ใช้ประโยชน์จากปริมาณงานที่มีอยู่อย่างเต็มที่ DynamoDB กระจายข้อมูลตารางในหลายพาร์ติชัน และปริมาณงานสแกนยังคง จำกัด อยู่ที่พาร์ติชันเดียวเนื่องจากการทำงานของพาร์ติชันเดียว

วิธีแก้ปัญหานี้มาจากการแบ่งตารางหรือดัชนีออกเป็นกลุ่มอย่างมีเหตุผล จากนั้น "คนงาน" แบบขนาน (พร้อมกัน) จะสแกนส่วนต่างๆ ใช้พารามิเตอร์ของ Segment และTotalSegments เพื่อระบุเซ็กเมนต์ที่สแกนโดยคนงานบางคนและระบุจำนวนเซ็กเมนต์ทั้งหมดที่ประมวลผล

หมายเลขผู้ปฏิบัติงาน

คุณต้องทดลองกับค่าผู้ปฏิบัติงาน (พารามิเตอร์กลุ่ม) เพื่อให้ได้ประสิทธิภาพของแอปพลิเคชันที่ดีที่สุด

Note- การสแกนแบบขนานกับคนงานจำนวนมากส่งผลต่อปริมาณงานโดยอาจใช้ปริมาณงานทั้งหมด จัดการปัญหานี้ด้วยพารามิเตอร์ Limit ซึ่งคุณสามารถใช้เพื่อหยุดผู้ปฏิบัติงานคนเดียวไม่ให้ใช้ปริมาณงานทั้งหมด

ต่อไปนี้เป็นตัวอย่างการสแกนแบบเจาะลึก

Note- โปรแกรมต่อไปนี้อาจถือว่าเป็นแหล่งข้อมูลที่สร้างขึ้นก่อนหน้านี้ ก่อนที่จะพยายามดำเนินการให้จัดหาไลบรารีที่สนับสนุนและสร้างแหล่งข้อมูลที่จำเป็น (ตารางที่มีคุณสมบัติที่ต้องการหรือแหล่งอ้างอิงอื่น ๆ )

ตัวอย่างนี้ยังใช้ Eclipse IDE, ไฟล์ข้อมูลรับรอง AWS และ AWS Toolkit ภายใน Eclipse AWS Java Project

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