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;
...?
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.
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ă.
Există 3 aspecte cu "mai rapid" aici.
, a subliniat J. Curran, mai puțin memoria alocată înseamnă mai repede. Aceeași observație ca în 1. se aplică aici.
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.
Î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.
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" .