SQLAlchemy 的內建產生器是否提供記憶體高效迭代?
在使用 SQLAlchemy 時,對資料的相當大部分進行大量查詢MySQL表可能會遇到記憶體消耗過多的情況。儘管假設內建生成器將以小塊的形式獲取數據,但這個問題仍然存在。為了緩解這種情況,用戶求助於創建自訂迭代器。
但是,對 SQLAlchemy 行為的仔細檢查表明,大多數 DBAPI 實作都會在檢索時緩衝行,從而導致甚至在 SQLAlchemy ORM 處理結果之前就消耗記憶體。此外,Query 的預設操作是在將物件傳回給使用者之前完全載入結果集。
對於複雜查詢,確保結果的完整性證明了此行為的合理性。但是,對於簡單的 SELECT 語句,Query 提供了 Yield_per() 選項來修改此功能,從而可以批次產生行。使用yield_per() 時務必謹慎,因為它需要對應用程式有深入的了解,並且在底層 DBAPI 預緩衝行的情況下效果較差。
更有效的方法是利用視窗函數。透過預先取一組代表資料區塊的「視窗」值,使用者可以產生針對特定視窗的單獨 SELECT 語句。此方法避免了 OFFSET 和 LIMIT 的限制,這些限制會導致效能隨著 OFFSET 值的增加而下降。
為了獲得最大效率,請考慮使用 PostgreSQL、Oracle 或 SQL Server,因為這些資料庫支援視窗函數。
以上是SQLAlchemy 的 `yield_per()` 是否真正為大型 MySQL 查詢提供記憶體高效的迭代?的詳細內容。更多資訊請關注PHP中文網其他相關文章!