Creșterea eficienței datorită folosirii sfaturilor către optimizator

Utilizând Indicele Sugestii

O sugestie pentru optimizatorul de a utiliza un anumit index este utilă atunci când este necesar să forțați SQL Server să utilizeze acest index, iar dacă este cu acest index, eficiența interogării va crește. Utilizați acest indiciu este cel mai bun atunci când știi sigur că SQL Server nu selectează indexul optim pentru interogare și trebuie să ajuți SQL Server să aleagă indexul corect. În sugestie, trebuie să specificați id-ul indexului sau numele acestuia. Mai jos este un exemplu de interogare care înlocuiește un id pentru un index:

Folosirea unui id de 0 va forța SQL Server să utilizeze scanarea indexului cluster dacă există. Dacă nu există un index cluster, atunci se va efectua o scanare simplă a tabelului. Mai jos este un exemplu de interogare care utilizează numele indexului în loc de id:

Comandă de comandă combinată

Ordinea intrării în SQL Server pentru fiecare tabel din clauza FROM afectează foarte mult modul în care interogarea sau procedura stocată va fi executată. Adunarea tabelelor într-o ordine greșită poate crește semnificativ timpul de execuție al interogării. Dacă credeți că SQL Server nu a ales ordinea optimă a tabelului, trebuie să găsiți cea mai bună ordine de asociere și să o specificați cu un indiciu. Pentru cele două exemple mici de mai jos, va fi util să luați în considerare planurile de execuție pentru a vedea cum sunt îmbinate tabelele, selectate de serverul SQL în ambele cazuri. Puteți vizualiza planurile din Analizatorul de interogări sau faceți clic pe link-ul corespunzător enumerat mai jos în această secțiune. Prima interogare arată ce se întâmplă atunci când tabelele nu sunt combinate optim.

Acum, executați a doua interogare (care este aceeași interogare, dar fără a utiliza sugestia).

Când indicele este eliminat din interogare, asocierea tabelelor va fi efectuată într-o ordine diferită. Ordinea pe care o utilizează SQL Server fără un indiciu este mai bună. Începe cu tabelul titleauthor, care este combinat cu tabela titlurilor. După aceasta, combinați cu masa rotunjită, rezultând combinarea celorlalte două mese.
O modalitate rapidă de a vedea care dintre interogările de mai sus funcționează mai repede este să le executați pe ambele în aceeași fereastră de analiză a interogărilor și să revizuiți împreună planurile lor de execuție. Deci, veți vedea de ce cea de-a doua interogare funcționează mai repede decât prima.
Faceți clic pe acest link: Primul plan de executare a cererii
Faceți clic pe acest link: Al doilea plan de executare a cererii
După cum puteți vedea, în prima interogare join, titlurile și tabelele scrise rezultă în 86 de înregistrări. Aceste 86 de înregistrări sunt folosite pentru următoarea buclă imbricată, cu intrare. Aici avem 123 de intrări care alcătuiesc rezultatul reprezentat de linkul de mai sus. În cea de-a doua interogare, prima intrare a tabelelor de titlu și a titlurilor generează 25 de intrări ca rezultat. În plus, nu există pași intermediari înainte de a fuziona cu cel de-al treilea tabel de 25 de înregistrări, după care se obține un set de rezultate de 123 intrări.
A doua interogare a fost rulată mai repede, deoarece se ocupă cu mai puține linii. Numărul de rânduri care au fost utilizate depinde în mare măsură de ordinea în care sunt combinate tabelele. Acest lucru demonstrează importanța ordinii de combinare a tabelelor. SQL Server analizează câțiva factori care afectează uniunea înainte de a decide ce ordine să utilizeze optim când fuzionează tabele. Aceasta este de obicei: numărul de rânduri din tabel, cheile primare, indexurile, numărul de procesoare și încărcarea serverului curent și, uneori, doar unii dintre acești factori. Dacă SQL Server plasează dintr-o dată tabelele pentru a se alătura în ordine greșită, încercați să remediați această problemă definindu-vă o ordine mai optimă folosind sugestia de alăturare a comenzii.

Sugestie nolock pentru mese

Clauza WITH (Nolock) este plasată întotdeauna imediat după numele mesei sau aliasului ei.
Interogarea de mai jos demonstrează modul în care puteți selecta date fără sugestia de nod și vizualizați aceste date înainte de a fi angajat folosind sugestia Nolock. Rulați următoarea interogare într-o fereastră separată Query Analyzer:

Această interogare va stabili o blocare exclusivă în tabelul titlurilor, ceea ce va face imposibilă modificarea acesteia până când executați comanda COMMIT TRANSACTION. Acum, într-o altă fereastră de analiză a interogărilor, conectați-vă la același server, lansați următoarea interogare:

Nu ezitați să întrerupeți executarea acestei solicitări când vă obosiți să așteptați rezultatul. Nu veți obține niciodată până când nu închideți o altă fereastră sau nu finalizați modificarea executând comanda de finalizare a tranzacției. SQL Server nu vă permite să vedeți datele până când această operație nu este finalizată sau reluată, deoarece, în mod prestabilit, va fi prescrisă o blocare exclusivă. Pentru a rezolva această problemă, puteți schimba interogarea pentru ca aceasta să arate astfel:

Utilizarea sugestiilor în interogările dvs. are sens, doar pentru că Microsoft a inclus utilizarea lor în setul de caracteristici ale SQL Server. Cu toate acestea, utilizarea celor mai multe sugestii ar trebui să fie limitată, cu excepția probabil indiciul, care este descris în cel de-al treilea exemplu. Încercarea de a crește eficiența cu sugestii este posibilă numai atunci când nu se poate găsi o altă soluție.