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