Rumah > pangkalan data > tutorial mysql > Mengapakah Pengendali Mengandungi() Rangka Kerja Entiti Begitu Lambat dengan Set Data Besar?

Mengapakah Pengendali Mengandungi() Rangka Kerja Entiti Begitu Lambat dengan Set Data Besar?

Linda Hamilton
Lepaskan: 2025-01-24 07:21:12
asal
448 orang telah melayarinya

Why is Entity Framework's Contains() Operator So Slow with Large Datasets?

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

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:

  • Optimumkan Perjalanan Pergi-balik Pangkalan Data: Daripada satu pertanyaan besar, laksanakan berbilang pertanyaan dengan subset data perbandingan yang lebih kecil.
  • Gunakan Pertanyaan Tersusun (dengan kaveat): 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!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan