เหตุใดการสแกน DynamoDB ของฉันจึงรวดเร็วโดยมีหน่วยความจุการอ่านที่จัดเตรียมไว้เพียง 1 หน่วย
ฉันสร้างตารางที่มีรายการ 1346 รายการแต่ละรายการมีขนาดน้อยกว่า 4KB ฉันจัดเตรียมหน่วยความจุในการอ่าน 1 หน่วยดังนั้นฉันคาดว่าโดยเฉลี่ยแล้ว 1 รายการต่อวินาทีจะอ่านได้ อย่างไรก็ตามการสแกนอย่างง่ายของรายการทั้งหมด 1346 รายการจะส่งคืนเกือบในทันที
ฉันพลาดอะไรไปที่นี่?
คำตอบ
สิ่งนี้มีแนวโน้มที่จะลดลงเพื่อเพิ่มขีดความสามารถในการเพิ่มขีดความสามารถของคุณในช่วงเวลา 300 วินาทีเพื่อใช้สำหรับการกระทำที่ไม่เสถียร (เช่นการสแกนทั้งตาราง)
ซึ่งหมายความว่าหากคุณใช้เครดิตเหล่านี้ทั้งหมดการโต้ตอบอื่น ๆ จะได้รับผลกระทบเนื่องจากมีความสามารถไม่เพียงพอสำหรับการโต้ตอบเหล่านี้
คุณสามารถดูปริมาณ WCU / RCU ที่ใช้ผ่านเมตริก CloudWatch หรือภายในอินเทอร์เฟซ DynamoDB (ผ่านแท็บ Metrics)
คุณไม่ได้กำหนดขนาดสำหรับรายการของคุณยกเว้นว่า "แต่ละรายการมีค่าน้อยกว่า 4KB" น้อยลงเท่าไร?
1 RCU จะรองรับการอ่าน 2 ครั้งที่สอดคล้องกันในที่สุดต่อวินาทีของรายการสูงสุด 4KB
อีกวิธีหนึ่งคือด้วย 1 RCU และการอ่านที่สอดคล้องกันในที่สุดคุณสามารถอ่านข้อมูล 8KB ต่อวินาที
หากคุณบันทึกเป็น 4KB คุณจะได้รับ 2 บันทึก / วินาที
1KB, 8 / วินาที
512B, 16 / วินาที
256B, 32 / วินาที
ดังนั้นความสามารถ "ระเบิด" ที่กล่าวไปแล้วจึงทำให้คุณใช้ 55 RCU ได้ แต่บันทึกของคุณมีขนาดเล็กทำให้ 55 RCU ส่งคืนข้อมูล "เกือบจะในทันที"
มีสองสิ่งที่คุณชอบที่นี่ - หนึ่งคือการScan
ดำเนินการใช้ RCU น้อยกว่าที่คุณคิดไว้สำหรับสินค้าชิ้นเล็ก ๆ อีกอย่างคือ "ระเบิดจุ" ฉันจะพยายามอธิบายทั้งสองอย่าง:
หน้าการกำหนดราคา DynamoDBกล่าวว่า "สำหรับรายการถึง 4 กิโลไบต์ในขนาดหนึ่ง RCU สามารถดำเนินการทั้งสองร้องขออ่านที่สอดคล้องกันในที่สุดต่อวินาที." สิ่งนี้ชี้ให้เห็นว่าแม้ว่ารายการจะมีขนาด 10 ไบต์ แต่ก็มีค่าใช้จ่ายครึ่งหนึ่งของ RCU ในการอ่านโดยมีความสอดคล้องกันในที่สุด อย่างไรก็ตามแม้ว่าพวกเขาจะไม่ได้ระบุทุกที่นี้ค่าใช้จ่ายนี้เป็นเพียงจริงสำหรับGetItem
การดำเนินการเพื่อเรียกรายการเดียว ในScan
หรือQuery
ปรากฎว่าคุณไม่ได้จ่ายแยกต่างหากสำหรับสินค้าแต่ละรายการ แต่การดำเนินการเหล่านี้จะสแกนข้อมูลที่จัดเก็บในดิสก์ตามลำดับและคุณต้องจ่ายเงินตามจำนวนข้อมูลที่อ่าน หากคุณ 1,000 รายการเล็ก ๆ และขนาดรวมที่ DynamoDB ต้องอ่านจากดิสก์คือ 80KB คุณจะต้องจ่าย 80KB / 4KB / 2 หรือ 10 RCU ไม่ใช่ 500 RCU
สิ่งนี้อธิบายว่าเหตุใดคุณจึงอ่าน 1346 รายการและวัดได้เพียง 55 RCU ไม่ใช่ 1346/2 = 673
สิ่งที่สองที่คุณชอบคือ DynamoDB มีความสามารถ "ระเบิดความจุ" อธิบายไว้ที่นี่ :
ปัจจุบัน DynamoDB ยังคงรักษาความสามารถในการอ่านและเขียนที่ไม่ได้ใช้งานได้สูงสุด 5 นาที (300 วินาที) ในระหว่างกิจกรรมการอ่านหรือเขียนเป็นครั้งคราวหน่วยความจุพิเศษเหล่านี้สามารถใช้งานได้อย่างรวดเร็วแม้จะเร็วกว่าความสามารถในการรับส่งข้อมูลต่อวินาทีที่คุณกำหนดไว้สำหรับตารางของคุณ
ดังนั้นหากฐานข้อมูลของคุณมีอยู่ 5 นาทีก่อนที่คุณจะร้องขอ DynamoDB จะบันทึก 300 RCU สำหรับคุณซึ่งคุณสามารถใช้งานได้อย่างรวดเร็ว เนื่องจาก 300 RCU มากกว่าที่คุณต้องการสำหรับการสแกน (55) การสแกนของคุณจึงเกิดขึ้นอย่างรวดเร็วโดยไม่ต้องมีการควบคุมปริมาณ
เมื่อคุณทำแบบสอบถามจำนวน RCU จะใช้กับปริมาณข้อมูลที่อ่านโดยไม่พิจารณาจำนวนรายการที่อ่าน ดังนั้นหากรายการของคุณมีขนาดเล็กให้พูดอย่างละไม่กี่ไบต์ก็สามารถสืบค้นได้อย่างง่ายดายภายใน 4KB RCU เดียว
สิ่งนี้มีประโยชน์อย่างยิ่งเมื่ออ่านหลายรายการจาก DynamoDB เช่นกัน ไม่ชัดเจนในทันทีว่าการค้นหารายการขนาดเล็กจำนวนมากนั้นถูกกว่าและมีประสิทธิภาพมากกว่าการรับสินค้าเป็นกลุ่ม