Rumah >pangkalan data >tutorial mysql >Mengapa NHibernate QueryOver dengan Fetch Menyebabkan Berbilang Pertanyaan Pangkalan Data, dan Bagaimana Saya Boleh Mengoptimumkannya?

Mengapa NHibernate QueryOver dengan Fetch Menyebabkan Berbilang Pertanyaan Pangkalan Data, dan Bagaimana Saya Boleh Mengoptimumkannya?

DDD
DDDasal
2025-01-04 12:04:35351semak imbas

Why Does NHibernate QueryOver with Fetch Cause Multiple Database Queries, and How Can I Optimize It?

NHibernate QueryOver dengan Fetch Incurring Multiple Query Executions

Melaksanakan QueryOver dengan klausa Fetch untuk mendapatkan semula entiti induk dan koleksi anaknya selalunya terhasil dalam hits pangkalan data yang berlebihan. Tingkah laku ini berlaku kerana NHibernate mengeluarkan pertanyaan berasingan untuk setiap baris dalam koleksi anak.

Untuk memahami perkara ini, pertimbangkan senario dengan entiti UserRole dan koleksi UsersInRole. Pertanyaan pertama mendapatkan semula entiti UserRole:

SELECT ... FROM UserRoles
left outer join UsersInRoles on ...

Untuk setiap UserRole yang diambil, NHibernate kemudian melaksanakan pertanyaan berasingan untuk mengambil koleksi UsersInRole, menghasilkan banyak pertanyaan dalam format:

SELECT ... FROM UsersInRoles
left outer join UserRoles on ...
WHERE UserRoles.UserId=?

Untuk mengoptimumkan tingkah laku ini, NHibernate membenarkan menetapkan sifat BatchSize pada Pemetaan HasManyToMany:

HasManyToMany(x => x.UsersInRole)
  ...
  .BatchSize(25)

Dengan menyatakan pilihan ini, NHibernate akan memuatkan koleksi anak dalam kelompok, mengurangkan bilangan pertanyaan pangkalan data kepada maksimum 1 (saiz kelompok / saiz halaman). Ini memastikan pengambilan data berkaitan dengan cekap sambil mengelakkan hits pangkalan data yang berlebihan.

Atas ialah kandungan terperinci Mengapa NHibernate QueryOver dengan Fetch Menyebabkan Berbilang Pertanyaan Pangkalan Data, dan Bagaimana Saya Boleh Mengoptimumkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn