Rangka Kerja Entiti Mengandungi(): Kesesakan Prestasi dan Penyelesaian
Menggunakan kaedah Contains()
Rangka Kerja Entiti dengan IEnumerable
boleh memperlahankan pelaksanaan pertanyaan secara mendadak. Ini kerana ia diterjemahkan kepada siri penyataan ATAU yang besar dan tidak cekap dalam pertanyaan SQL yang dijana.
Bagaimana Contains()
Mempengaruhi Prestasi
Rangka Kerja Entiti tidak mempunyai sokongan asli untuk klausa IN
SQL. Akibatnya, Contains()
ditukar kepada berbilang keadaan ATAU. Lebih banyak item dalam IEnumerable
, lebih besar dan perlahan pertanyaan yang terhasil. Walaupun sesetengah penyedia ADO.NET mencuba pengoptimuman, ini tidak selalu berjaya, terutamanya dengan set data yang besar. Ini boleh membawa kepada kemerosotan prestasi yang ketara, seperti yang digambarkan oleh contoh yang menunjukkan peningkatan masa pertanyaan daripada 0.07 saat kepada 20.14 saat selepas menambah Contains()
.
Strategi untuk Peningkatan Prestasi
Beberapa kaedah boleh membantu meningkatkan prestasi:
CompiledQuery
untuk cache pelan pelaksanaan. Walau bagaimanapun, ini bukan penyelesaian universal dan bergantung pada konteks pertanyaan.IN
secara langsung dengan memisahkan logik Contains()
ke dalam pertanyaan berasingan yang dilaksanakan secara manual.IEnumerable
dalam kelompok yang lebih kecil, melaksanakan berbilang pertanyaan dengan syarat ATAU yang lebih sedikit. Ini mengurangkan kerumitan setiap pertanyaan individu.Peningkatan Masa Depan
Pasukan Rangka Kerja Entiti menyedari pengehadan ini dan merancang untuk menambah sokongan langsung untuk klausa IN
dalam keluaran akan datang, menghapuskan keperluan untuk penyelesaian ini.
Atas ialah kandungan terperinci Mengapa Pengendali Mengandungi() Entiti Rangka Kerja Begitu Lambat dan Bagaimana Saya Boleh Meningkatkan Prestasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!