Jaga kinerja:
Saya mengalami bahwa setidaknya dengan EF Core jawaban berbeda yang diberikan di sini mungkin menghasilkan kinerja yang berbeda. Saya sadar bahwa OP bertanya tentang Linq ke SQL, tetapi bagi saya sepertinya pertanyaan yang sama juga terjadi pada EF Core.
Dalam kasus tertentu yang harus saya tangani, saran (secara sintaksis lebih bagus) dari Marc Gravell menghasilkan gabungan kiri di dalam tanda silang berlaku - mirip dengan yang dideskripsikan oleh Mike U - yang menghasilkan hasil estimasi biaya untuk permintaan spesifik ini adalah dua. kali lebih tinggi dibandingkan dengan kueri tanpa gabungan silang . Waktu eksekusi server berbeda dengan faktor 3 . [1]
Solusi oleh Marc Gravell menghasilkan permintaan tanpa cross joins.
Konteks: Saya pada dasarnya perlu melakukan dua gabungan kiri pada dua tabel yang masing-masing lagi membutuhkan bergabung ke meja lain. Selain itu, di sana saya harus menentukan di mana-kondisi lain pada tabel di mana saya perlu menerapkan join kiri. Selain itu, saya memiliki dua gabungan batin di meja utama.
Perkiraan biaya operator:
- dengan cross berlaku: 0.2534
- tanpa silang berlaku: 0,0991.
Waktu eksekusi server dalam ms (kueri dieksekusi 10 kali; diukur menggunakan SET STATISTICS TIME ON):
- dengan cross berlaku: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- tanpa tanda silang berlaku: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(Run pertama sangat lambat untuk kedua query; tampaknya ada sesuatu yang di-cache.)
Ukuran meja:
- tabel utama: 87 baris,
- tabel pertama untuk join kiri: 179 baris;
- tabel kedua untuk join kiri: 7 baris.
Versi EF Core: 2.2.1.
Versi SQL Server: MS SQL Server 2017 - 14 ... (di Windows 10).
Semua tabel yang relevan memiliki indeks pada kunci utama saja.
Kesimpulan saya: selalu disarankan untuk melihat SQL yang dihasilkan karena dapat sangat berbeda.
[1] Cukup menarik, ketika mengatur 'Statistik klien' di MS SQL Server Management Studio aktif, saya bisa melihat tren yang berlawanan; yaitu bahwa menjalankan solusi terakhir tanpa cross berlaku membutuhkan lebih dari 1s. Saya kira ada sesuatu yang salah di sini - mungkin dengan pengaturan saya.