Performansa dikkat edin:
En azından EF Core ile burada verilen farklı cevapların farklı performansa neden olabileceğini deneyimledim . OP'nin Linq to SQL hakkında sorduğunun farkındayım, ama bana öyle geliyor ki EF Core ile de aynı sorular ortaya çıkıyor.
Ele almak zorunda olduğum özel bir durumda, Marc Gravell'in (sözdizimsel olarak daha güzel) önerisi, bir haç içinde sol birleşmelerle sonuçlandı - Mike U'nun tarif ettiği gibi - bu özel sorgu için tahmini maliyetlerin iki olduğu sonucuna vardı. çapraz birleşim olmayan bir sorguya göre daha yüksek . Sunucu yürütme süreleri 3 kat farklıydı . [1]
Marc Gravell'in çözümü çapraz birleşmeler olmadan bir sorgu ile sonuçlandı.
Bağlam: Aslında her biri tekrar başka bir tablo için birleştirme gerektiren iki tabloda iki sol birleştirme yapmak gerekiyordu. Ayrıca, sol birleşimi uygulamak için gereken tablolarda başka nerede koşullar belirtmek zorunda kaldım. Ayrıca, ana masada iki iç birleşim vardı.
Tahmini operatör maliyetleri:
- çapraz uygulama ile: 0.2534
- çapraz uygulama olmadan: 0.0991.
Ms cinsinden sunucu yürütme süreleri (sorgular 10 kez yürütülür; SET STATISTICS TIME ON kullanılarak ölçülür):
- çapraz uygulama ile: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- çapraz uygulama olmadan: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(İlk çalıştırma her iki sorgu için daha yavaştı; bir şey önbelleğe alınmış gibi görünüyor.)
Tablo boyutları:
- ana tablo: 87 sıra,
- sol birleşim için ilk tablo: 179 sıra;
- sol birleşim için ikinci tablo: 7 satır.
EF Çekirdek sürümü: 2.2.1.
SQL Server sürümü: MS SQL Server 2017 - 14 ... (Windows 10'da).
İlgili tüm tabloların yalnızca birincil anahtarlarda dizinleri vardı.
Sonuç: gerçekten farklı olabileceğinden, daima üretilen SQL'e bakmanız önerilir.
[1] İlginç bir şekilde, MS SQL Server Management Studio'da 'İstemci istatistikleri' ayarlanırken karşıt bir eğilim görebiliyordum; yani çapraz uygulama olmadan çözeltinin son çalışması 1 saniyeden fazla sürdü. Sanırım burada bir şeyler ters gidiyordu - belki benim kurulumumda.