Rangka Kerja Entiti Mengandungi(): Bottleneck Prestasi dengan Set Data Besar
Menggunakan kaedah Contains()
Rangka Kerja Entiti dengan set data yang luas boleh menjejaskan prestasi dengan teruk. Ini berpunca daripada terjemahannya kepada satu siri pernyataan OR dalam SQL yang dijana, yang menjadi tidak cekap apabila berurusan dengan banyak perbandingan.
Pertimbangkan contoh ini:
<code class="language-csharp">var ids = Main.Select(a => a.Id).ToArray(); var rows = Main.Where(a => ids.Contains(a.Id)).ToArray();</code>
Perbandingan yang melibatkan jadual 10,000 rekod dan tatasusunan 100 elemen boleh sehingga 288 kali lebih perlahan daripada pertanyaan LINQ mudah yang mendapatkan semula semua baris. Punca utama terletak pada kekurangan sokongan ADO.NET asli untuk ekspresi IN. Penyelesaian EF—pokok ekspresi ATAU yang kompleks—adalah mahal dari segi pengiraan untuk set input yang besar.
Penyelesaian dan Strategi
Pendekatan optimum adalah untuk memanfaatkan pengendali In()
, kerana ia disokong secara asli oleh penyedia ADO.NET, yang membawa kepada SQL yang lebih cekap.
Jika In()
tidak boleh dilaksanakan, pertimbangkan alternatif ini:
CompiledQuery
memerlukan jenis data asas. Untuk menggunakannya dengan tatasusunan atau IEnumerable
, buat fungsi tersuai yang menukar input kepada jenis asas (cth., rentetan dipisahkan koma). Rentetan yang ditukar ini kemudiannya boleh digunakan dalam CompiledQuery
menggunakan operator In()
.Melihat Ke Hadapan
Pasukan Rangka Kerja Entiti menyedari had prestasi ini dan sedang meneroka sokongan asli untuk ekspresi IN dalam model penyedia. Peningkatan ini akan meningkatkan prestasi Contains()
dengan ketara untuk set data yang besar.
Atas ialah kandungan terperinci Mengapakah Pengendali Mengandungi() Rangka Kerja Entiti Begitu Lambat dengan Set Data Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!