Çoğu DBAPI uygulaması, getirilirken satırları tam olarak arabelleğe alır - bu nedenle genellikle, SQLAlchemy ORM bir sonucu tutmadan önce, tüm sonuç kümesi bellekte bulunur.
Ancak daha sonra, Query
size nesnelerinize dönmeden önce varsayılan olarak verilen sonuç kümesini tamamen yüklemesinin yolu çalışır. Buradaki mantık, basit SELECT ifadelerinden daha fazlası olan sorgularla ilgilidir. Örneğin, aynı nesne kimliğini bir sonuç kümesinde birden çok kez döndürebilen diğer tablolarla birleştirmelerde (istekli yüklemeyle ortaktır), tüm satır kümesinin bellekte olması gerekir, böylece doğru sonuçlar, aksi takdirde koleksiyonlar ve benzeri döndürülebilir. yalnızca kısmen nüfuslu olabilir.
Bu nedenle Query
, bu davranışı değiştirme seçeneği sunar yield_per()
. Bu çağrı Query
, toplu iş boyutunu verdiğiniz toplu işlerde satırlar vermesine neden olacaktır . Dokümanların belirttiği gibi, bu yalnızca herhangi bir istekli koleksiyon yüklemesi yapmıyorsanız uygundur, bu nedenle temelde ne yaptığınızı gerçekten biliyorsanız. Ayrıca, temeldeki DBAPI satırları önceden tamponlarsa, yine de bu bellek yükü olacaktır, bu nedenle yaklaşım, kullanmamaktan biraz daha iyi ölçeklenir.
Neredeyse hiç kullanmıyorum yield_per()
; bunun yerine, pencere işlevlerini kullanarak yukarıda önerdiğiniz LIMIT yaklaşımının daha iyi bir sürümünü kullanıyorum. LIMIT ve OFFSET, çok büyük OFFSET değerlerinin sorgunun daha yavaş ve daha yavaş olmasına neden olduğu büyük bir soruna sahiptir, çünkü N'nin OFFSET'i N satırdan geçmesine neden olur - aynı sorguyu bir yerine elli kez yapmak, her seferinde a daha büyük ve daha fazla sayıda satır. Pencere işlevi yaklaşımıyla, seçmek istediğim tablonun parçalarına atıfta bulunan bir dizi "pencere" değerini önceden getiriyorum. Daha sonra, her biri bir seferde bu pencerelerin birinden çekilen ayrı SELECT ifadeleri yayınlıyorum.
Pencere işlevi yaklaşımı wiki'de ve onu büyük bir başarıyla kullanıyorum.
Ayrıca, tüm veritabanları pencere işlevlerini desteklemez; Postgresql, Oracle veya SQL Server'a ihtiyacınız var. En azından Postgresql kullanan IMHO kesinlikle buna değer - ilişkisel bir veritabanı kullanıyorsanız, en iyisini kullanabilirsiniz.