การนำ DBAPI ไปใช้งานส่วนใหญ่จะบัฟเฟอร์แถวอย่างสมบูรณ์ตามที่มีการดึงข้อมูลดังนั้นโดยปกติก่อนที่ SQLAlchemy ORM จะได้รับผลลัพธ์เพียงรายการเดียวชุดผลลัพธ์ทั้งหมดจะอยู่ในหน่วยความจำ
แต่วิธีการQuery
ทำงานก็คือโหลดผลลัพธ์ที่กำหนดตามค่าเริ่มต้นอย่างสมบูรณ์ก่อนที่จะส่งคืนวัตถุให้คุณ เหตุผลในที่นี้เกี่ยวกับการสืบค้นที่มากกว่าคำสั่ง SELECT แบบธรรมดา ตัวอย่างเช่นในการรวมเข้ากับตารางอื่นที่อาจส่งคืนข้อมูลประจำตัวของอ็อบเจ็กต์เดียวกันหลายครั้งในชุดผลลัพธ์หนึ่งชุด (โดยทั่วไปกับการโหลดอย่างกระตือรือร้น) แถวทั้งหมดจะต้องอยู่ในหน่วยความจำเพื่อให้สามารถส่งคืนผลลัพธ์ที่ถูกต้องได้มิฉะนั้นจะมีการรวบรวม อาจมีเพียงบางส่วนเท่านั้น
ดังนั้นมีตัวเลือกที่จะเปลี่ยนพฤติกรรมนี้ผ่านQuery
yield_per()
การเรียกนี้จะทำให้เกิดQuery
แถวเป็นแบตช์โดยที่คุณกำหนดขนาดแบทช์ ตามสถานะของเอกสารสิ่งนี้จะเหมาะสมก็ต่อเมื่อคุณไม่ได้ทำการโหลดคอลเลกชันใด ๆ อย่างกระตือรือร้นดังนั้นโดยพื้นฐานแล้วถ้าคุณรู้ว่าคุณกำลังทำอะไร นอกจากนี้หากแถวก่อนบัฟเฟอร์ DBAPI ที่อยู่ภายใต้จะยังคงมีค่าใช้จ่ายของหน่วยความจำนั้นดังนั้นวิธีการจะปรับขนาดได้ดีกว่าการไม่ใช้
ฉันแทบไม่เคยใช้yield_per()
; แต่ฉันใช้แนวทาง LIMIT เวอร์ชันที่ดีกว่าที่คุณแนะนำข้างต้นโดยใช้ฟังก์ชันหน้าต่างแทน LIMIT และ OFFSET มีปัญหาใหญ่ที่ค่า OFFSET ที่ใหญ่มากทำให้การสืบค้นช้าลงและช้าลงเนื่องจาก OFFSET ของ N ทำให้หน้าผ่าน N แถว - เหมือนกับการทำแบบสอบถามเดียวกันห้าสิบครั้งแทนที่จะเป็นหนึ่งในแต่ละครั้งที่อ่าน a จำนวนแถวที่มากขึ้นและมากขึ้น ด้วยวิธีการทำงานของหน้าต่างฉันจะดึงชุดของค่า "หน้าต่าง" ไว้ล่วงหน้าซึ่งอ้างถึงส่วนของตารางที่ฉันต้องการเลือก จากนั้นฉันจะปล่อยคำสั่ง SELECT แต่ละรายการที่ดึงจากหน้าต่างเหล่านั้นทีละรายการ
วิธีการทำงานของหน้าต่างอยู่ในวิกิและฉันใช้มันอย่างประสบความสำเร็จ
หมายเหตุ: ฐานข้อมูลบางส่วนไม่รองรับฟังก์ชันหน้าต่าง คุณต้องใช้ Postgresql, Oracle หรือ SQL Server IMHO ที่ใช้ Postgresql เป็นอย่างน้อยก็คุ้มค่าอย่างแน่นอน - หากคุณใช้ฐานข้อมูลเชิงสัมพันธ์คุณอาจใช้สิ่งที่ดีที่สุดเช่นกัน