Adakah Penjana Terbina Dalam SQLAlchemy Menawarkan Lelaran Cekap Memori?
Dalam menggunakan SQLAlchemy, sejumlah besar pertanyaan pada bahagian yang besar Jadual MySQL mungkin menghadapi penggunaan memori yang berlebihan. Isu ini berterusan walaupun terdapat andaian bahawa penjana terbina dalam akan mengambil data dalam ketulan bersaiz gigitan. Untuk mengurangkan perkara ini, pengguna terpaksa mencipta iterator tersuai.
Walau bagaimanapun, pemeriksaan yang lebih dekat terhadap tingkah laku SQLAlchemy mendedahkan bahawa kebanyakan pelaksanaan DBAPI menampan baris apabila diperoleh semula, yang membawa kepada penggunaan memori walaupun sebelum SQLAlchemy ORM memproses keputusan. . Selain itu, operasi lalai Query adalah untuk memuatkan set hasil sepenuhnya sebelum mengembalikan objek kepada pengguna.
Untuk pertanyaan yang rumit, memastikan integriti keputusan membenarkan tingkah laku ini. Walau bagaimanapun, untuk pernyataan SELECT mudah, Query menawarkan pilihan yield_per() untuk mengubah suai fungsi ini, membolehkan penghasilan baris dalam kelompok. Adalah penting untuk berhati-hati apabila menggunakan yield_per(), kerana ia memerlukan pemahaman lanjut tentang aplikasi dan kurang berkesan dalam kes di mana baris pra-penampan DBAPI yang mendasarinya.
Pendekatan yang lebih cekap melibatkan penggunaan fungsi tetingkap. Dengan pra-mengambil set nilai "tetingkap" yang mewakili ketulan data, pengguna boleh menjana pernyataan SELECT individu yang menyasarkan tetingkap tertentu. Kaedah ini mengelakkan pengehadan OFFSET dan LIMIT, yang mengakibatkan kemerosotan prestasi dengan peningkatan nilai OFFSET.
Untuk kecekapan maksimum, pertimbangkan untuk menggunakan PostgreSQL, Oracle atau SQL Server, kerana pangkalan data ini menyokong fungsi tetingkap.
Atas ialah kandungan terperinci Adakah `yield_per()` SQLAlchemy Menawarkan Lelaran Cekap Memori untuk Pertanyaan MySQL yang Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!