Rumah >pangkalan data >tutorial mysql >Mengapa NHibernate QueryOver dengan Fetch Menyebabkan Berbilang Pertanyaan Pangkalan Data, dan Bagaimana Saya Boleh Mengoptimumkannya?
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!