Linq to SQL: selectați optimizarea

Pe mese mari în MSSQL; selectarea unor coloane specifice duce la o viteză mai mare a interogării. Același lucru se aplică Linq la SQL?

Ar fi aceasta:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select new { p.PersonsID, p.PersonsAdress, p.PersonsZipcode };

fi mai rapid decât aceasta:

var person = from p in [DataContextObject].Persons
             where p.PersonsID == 1
             select p;

...?

6

6 răspunsuri

Vă recomandăm foarte mult LinqPad . Este gratuit și vă permite să rulați în mod dinamic interogările LINQ. Când se poate consulta, de asemenea, SQL-ul care este generat.

Ceea ce veți vedea este că interogarea LINQ va traduce prima interogare în selectarea acelor coloane. Deci este mai rapid.

6
adăugat

Dacă limitați mărimea rezultatului setat selectând doar câteva coloane specifice, atunci YES va avea un efect.

EDIT ading clarification from comment

Cum este mai bine acest lucru, va reduce dimensiunea datelor rezultate din SQL și va reduce dimensiunea obiectelor utilizate pentru stocarea rezultatelor în memorie.

Acest lucru se datorează faptului că în cele din urmă LINQ to SQL generează SQL, astfel încât aceleași avantaje de performanță există.

4
adăugat
Ambii! SQL Server va răspunde mai rapid, limitând datele transmise și va reduce dimensiunea colecției care conține rezultatele, reducând memoria
adăugat autor Mitchel Sellers, sursa
Rezultă o scădere a alocării de memorie? Sau viteza mai mare?
adăugat autor roosteronacid, sursa

Există 3 aspecte cu "mai rapid" aici.

  1. înseamnă mai puține date transmise mai repede. Pe de altă parte, o va face nu obțineți mai rapid semnificativ cu excepția cazului în care selectați mai mult de un rând sau dacă persoana dvs. conține ceva alte coloane "grele" - lungi varchare, imagine etc.
  2. , a subliniat J. Curran, mai puțin memoria alocată înseamnă mai repede. Aceeași observație ca în 1. se aplică aici.

  3. Interogarea dvs. se execută mai repede dacă sunteți au un indice care conține toate coloanele selectate (sau atașate la acestea începând de la SQL Server 2005). În acest caz, motorul SQL Server nu trebuie să încarce pagina cu rândul în memorie - dacă nu este încă acolo.

Personal nu mi-ar deranja să-mi optimizez interogările în acest fel (dacă, așa cum am spus, rândurile tale conțin date binare sau șiruri foarte lungi pe care nu ai nevoie), parțial pentru că dacă vei decide mai târziu că vrei să ai mai mult informații despre această persoană selectată, va trebui să schimbați codul de acces DB față de accesarea unei proprietăți din clasa POCO/anonim.

3
adăugat

În plus față de ceea ce au spus ceilalți, noua structură anonimă va fi un obiect cu o greutate mult mai ușoară decât obiectul Persoană - ar fi mult mai rapid chiar dacă ați selectat toate coloanele. (Persoana are metodă/câmpuri etc. pentru a sprijini scrierea obiectului înapoi în baza de date.

1
adăugat

Cred că același lucru se aplică, deoarece LINQ to SQL traduce operațiile de interogare Linq la comenzile SQL.

1
adăugat

Dacă aveți coloane care sunt foarte mari, cum ar fi binarele și imaginile, atunci poate face o diferență semnificativă și de aceea LINQ to SQL vă permite să specificați încărcarea întârziată pentru anumite coloane astfel încât să puteți selecta încă obiecte întregi fără a efectua proiecții "selectați noi" .

1
adăugat