Zadbaj o wydajność:
Doświadczyłem, że przynajmniej w przypadku EF Core różne odpowiedzi podane tutaj mogą skutkować inną wydajnością. Zdaję sobie sprawę, że OP pytał o Linq do SQL, ale wydaje mi się, że te same pytania pojawiają się również z EF Core.
W konkretnym przypadku, z którym miałem do czynienia, (ładniejsza składniowo) sugestia Marca Gravella spowodowała, że lewe łączenia wewnątrz krzyża zostały zastosowane - podobnie do tego, co opisał Mike U - co skutkowało tym, że szacunkowe koszty tego konkretnego zapytania wyniosły dwa razy wyższy w porównaniu z zapytaniem bez połączeń krzyżowych . Czasy wykonania serwera różniły się 3- krotnie . [1]
Rozwiązanie autorstwa Marca Gravella spowodowało zapytanie bez łączeń krzyżowych.
Kontekst: Zasadniczo potrzebowałem wykonać dwa łączenia po lewej stronie na dwóch stołach, z których każdy ponownie wymagał połączenia z innym stołem. Ponadto musiałem określić inne warunki gdzie-w tabelach, na których musiałem zastosować lewe sprzężenie. Ponadto miałem dwa wewnętrzne łączenia na głównym stole.
Szacunkowe koszty operatora:
- z krzyżem: 0,2534
- bez krzyżyka: 0,0991.
Czasy wykonania serwera w ms (zapytania wykonywane 10 razy; mierzone za pomocą funkcji SET STATISTICS TIME ON):
- z krzyżem stosuje się: 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- bez krzyżyka stosuje się: 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(Pierwsze uruchomienie było wolniejsze dla obu zapytań; wydaje się, że coś jest w pamięci podręcznej).
Rozmiary stołów:
- stół główny: 87 rzędów,
- pierwsza tabela dla złączenia lewego: 179 wierszy;
- druga tabela dla złączenia lewego: 7 rzędów.
Wersja EF Core: 2.2.1.
Wersja SQL Server: MS SQL Server 2017-14 ... (w systemie Windows 10).
Wszystkie odpowiednie tabele miały indeksy tylko dla kluczy podstawowych.
Mój wniosek: zawsze zaleca się przyjrzenie się wygenerowanemu kodowi SQL, ponieważ może się naprawdę różnić.
[1] Co ciekawe, ustawiając „Statystyki klienta” w MS SQL Server Management Studio na, zauważyłem odwrotny trend; mianowicie, że ostatnie uruchomienie rozwiązania bez zastosowania krzyżyka zajęło więcej niż 1 s. Przypuszczam, że coś tu było nie tak - może z moją konfiguracją.