เหตุใดการสแกน DynamoDB ของฉันจึงรวดเร็วโดยมีหน่วยความจุการอ่านที่จัดเตรียมไว้เพียง 1 หน่วย

Aug 19 2020

ฉันสร้างตารางที่มีรายการ 1346 รายการแต่ละรายการมีขนาดน้อยกว่า 4KB ฉันจัดเตรียมหน่วยความจุในการอ่าน 1 หน่วยดังนั้นฉันคาดว่าโดยเฉลี่ยแล้ว 1 รายการต่อวินาทีจะอ่านได้ อย่างไรก็ตามการสแกนอย่างง่ายของรายการทั้งหมด 1346 รายการจะส่งคืนเกือบในทันที

ฉันพลาดอะไรไปที่นี่?

คำตอบ

4 ChrisWilliams Aug 19 2020 at 14:24

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

ซึ่งหมายความว่าหากคุณใช้เครดิตเหล่านี้ทั้งหมดการโต้ตอบอื่น ๆ จะได้รับผลกระทบเนื่องจากมีความสามารถไม่เพียงพอสำหรับการโต้ตอบเหล่านี้

คุณสามารถดูปริมาณ WCU / RCU ที่ใช้ผ่านเมตริก CloudWatch หรือภายในอินเทอร์เฟซ DynamoDB (ผ่านแท็บ Metrics)

2 Charles Aug 19 2020 at 22:43

คุณไม่ได้กำหนดขนาดสำหรับรายการของคุณยกเว้นว่า "แต่ละรายการมีค่าน้อยกว่า 4KB" น้อยลงเท่าไร?

1 RCU จะรองรับการอ่าน 2 ครั้งที่สอดคล้องกันในที่สุดต่อวินาทีของรายการสูงสุด 4KB

อีกวิธีหนึ่งคือด้วย 1 RCU และการอ่านที่สอดคล้องกันในที่สุดคุณสามารถอ่านข้อมูล 8KB ต่อวินาที

หากคุณบันทึกเป็น 4KB คุณจะได้รับ 2 บันทึก / วินาที
1KB, 8 / วินาที
512B, 16 / วินาที
256B, 32 / วินาที

ดังนั้นความสามารถ "ระเบิด" ที่กล่าวไปแล้วจึงทำให้คุณใช้ 55 RCU ได้ แต่บันทึกของคุณมีขนาดเล็กทำให้ 55 RCU ส่งคืนข้อมูล "เกือบจะในทันที"

1 NadavHar'El Aug 20 2020 at 18:01

มีสองสิ่งที่คุณชอบที่นี่ - หนึ่งคือการ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) การสแกนของคุณจึงเกิดขึ้นอย่างรวดเร็วโดยไม่ต้องมีการควบคุมปริมาณ

1 SudhirJonathan Aug 24 2020 at 13:45

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

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