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
Lepaskan: 2025-01-04 12:04:35
asal
378 orang telah melayarinya

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 ...
Salin selepas log masuk

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=?
Salin selepas log masuk

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

HasManyToMany(x => x.UsersInRole)
  ...
  .BatchSize(25)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan