Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

iterator/generator SqlAlchemy built-in yang hemat memori?

Sebagian besar implementasi DBAPI sepenuhnya menyangga baris saat diambil - jadi biasanya, sebelum SQLAlchemy ORM bahkan mendapatkan satu hasil, seluruh rangkaian hasil ada di memori.

Tapi kemudian, cara Query berfungsi adalah bahwa itu sepenuhnya memuat hasil yang diberikan yang ditetapkan secara default sebelum mengembalikan objek Anda kepada Anda. Alasan di sini menganggap pertanyaan yang lebih dari pernyataan SELECT sederhana. Misalnya, dalam gabungan ke tabel lain yang dapat mengembalikan identitas objek yang sama beberapa kali dalam satu kumpulan hasil (umum dengan pemuatan bersemangat), kumpulan baris lengkap harus ada di memori sehingga hasil yang benar dapat dikembalikan jika tidak, koleksi dan semacamnya mungkin hanya sebagian terisi.

Jadi Query menawarkan opsi untuk mengubah perilaku ini melalui yield_per() . Panggilan ini akan menyebabkan Query untuk menghasilkan baris dalam batch, di mana Anda memberikan ukuran batch. Seperti yang dinyatakan oleh dokumen, ini hanya sesuai jika Anda tidak melakukan pemuatan koleksi yang bersemangat, jadi pada dasarnya jika Anda benar-benar tahu apa yang Anda lakukan. Juga, jika baris pra-buffer DBAPI yang mendasarinya, masih akan ada overhead memori sehingga pendekatan ini hanya menskalakan sedikit lebih baik daripada tidak menggunakannya.

Saya hampir tidak pernah menggunakan yield_per(); sebagai gantinya, saya menggunakan versi yang lebih baik dari pendekatan LIMIT yang Anda sarankan di atas menggunakan fungsi jendela. LIMIT dan OFFSET memiliki masalah besar yaitu nilai OFFSET yang sangat besar menyebabkan kueri menjadi lebih lambat dan lebih lambat, karena OFFSET dari N menyebabkannya membuka halaman melalui N baris - ini seperti melakukan kueri yang sama lima puluh kali alih-alih satu, setiap kali membaca a jumlah baris yang lebih banyak dan lebih banyak. Dengan pendekatan fungsi-jendela, saya mengambil terlebih dahulu serangkaian nilai "jendela" yang merujuk pada potongan tabel yang ingin saya pilih. Saya kemudian mengeluarkan pernyataan SELECT individual yang masing-masing menarik dari salah satu jendela itu pada satu waktu.

Pendekatan fungsi jendela di wiki dan saya menggunakannya dengan sangat sukses.

Perhatikan juga:tidak semua basis data mendukung fungsi jendela; Anda memerlukan Postgresql, Oracle, atau SQL Server. IMHO menggunakan setidaknya Postgresql pasti sepadan - jika Anda menggunakan database relasional, Anda sebaiknya menggunakan yang terbaik.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hitung desil dari keterkinian di MySQL

  2. Perbarui satu tabel MySQL dengan nilai dari yang lain

  3. Pegas, Hibernasi, Blob pemuatan malas

  4. Memeriksa tabel untuk tumpang tindih waktu?

  5. Bagaimana cara mengambil catatan pertama dan terakhir dari catatan yang dikelompokkan dalam kueri MySQL dengan fungsi agregat?