Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 10757|Odpoveď: 0

[Zdroj] 30 bodov na zlepšenie rýchlosti SQL dotazov

[Kopírovať odkaz]
Zverejnené 27. 1. 2015 20:09:54 | | |

1. Na optimalizáciu dotazu by ste sa mali snažiť vyhnúť úplnému skenovaniu tabuliek a najskôr zvážiť vytvorenie indexu na stĺpcoch, kde a v poradí po.



2. Snažte sa vyhnúť nulovému hodnotovému súdu na poliach v klauzule where, inak to spôsobí, že engine upustí od indexov a vykoná úplné skenovanie tabuliek, napríklad:

Vyberte id z T, kde num je nul

Môžete nastaviť predvolenú hodnotu 0 na num, uistiť sa, že v stĺpci num v tabuľke nie je žiadna null, a potom sa dotazovať takto:

vyber id z t, kde num=0



3. Snažte sa vyhnúť používaniu operátorov != alebo <> v klauzule where, inak engine opustí používanie indexov a vykoná skenovanie celej tabuľky.



4. Mali by ste sa snažiť vyhnúť používaniu OR v klauzule where na pripojenie podmienky, inak to spôsobí, že engine prestane používať indexy a vykoná kompletné skenovanie tabuľky, napríklad:

Vyberte id z T, kde num=10 alebo num=20

Môžete sa dopytovať takto:

Vyberte id z T, kde num=10

Zjednotenie všetkých

Vyberte id z T, kde num=20



5.in a not in by sa tiež mali používať opatrne, inak to povedie k úplnému skenovaniu tabuľky, napríklad:

Vyberte id z t, kde num in(1,2,3)

Pre spojité hodnoty nepoužívajte in, ak môžete použiť medzi:

Vyberte id z t, kde num medzi 1 a 3



6. Nasledujúci dotaz tiež vedie k úplnému skenovaniu tabuľky:

Vyberte id z T, kde sa volá napríklad '%abc%'

Pre zvýšenie efektivity zvážte fulltextové vyhľadávanie.



7. Ak použijete parameter v klauzule where, spôsobí to tiež úplné skenovanie tabuľky. Pretože SQL rieši lokálne premenné iba za behu, ale optimalizátor nemôže odložiť výber prístupových plánov na runtime; Musí byť vybraný pri kompilácii. Ak je však plán prístupu vytvorený pri kompilácii, hodnota premennej je stále neznáma a preto nemôže byť použitá ako vstupná položka na výber indexu. Nasledujúce vyhlásenia budú naskenované v plnom rozsahu:

Vyberte id z t, kde num=@num

Môžete donútiť dotaz použiť index:

Vyberte id z t with(index(index(index name)) kde num=@num



8. Snažte sa vyhnúť vyjadrovaniu polí v klauzule where, čo spôsobí, že engine opustí používanie indexov v prospech úplného skenovania tabuliek. Napríklad:

Vyberte id z T, kde num/2=100

Mali by sa zmeniť na:

Vyberte id z T, kde num=100*2



9. Snažte sa vyhnúť vykonávaniu funkčných operácií na poliach v klauzule where, čo spôsobí, že engine opustí používanie indexov v prospech úplného skenovania tabuliek. Napríklad:

Vyberte id z T, kde substring(meno,1,3)='abc' --ID mena, ktoré začína na abc

Vyberte ID z T, kde datediff(day,createdate,'2005-11-30')=0--'2005-11-30' generované ID

Mali by sa zmeniť na:

Vyberte id od T, kde sa volá napríklad 'abc%'

Vyberte ID z T, kde vytvorené>='2005-11-30' a vytvorené<'2005-12-1'



10. Nevykonávajte funkcie, aritmetické operácie ani iné výrazové operácie naľavo od "=" v klauzule where, inak systém nemusí byť schopný správne použiť index.



11. Pri použití indexového poľa ako podmienky, ak je index zložený index, musí byť prvé pole v indexe použité ako podmienka, aby systém použil daný index, inak sa index nepoužije a poradie polí by malo byť čo najviac v súlade s indexovým poradím.



12. Nepíšte nezmyselné dotazy, napríklad generovanie prázdnej tabuľkovej štruktúry:

Vyberte stĺp1,stĺp2 do #t z T, kde 1=0

Tento typ kódu nevracia žiadnu súbor výsledkov, ale spotrebúva systémové zdroje, preto by sa mal zmeniť na niečo takéto:

Create table #t(...)



13. Často je dobré nahradiť v a existuje:

Vyberte num z A, kde num v (vyberte num z b)

Nahradiť to nasledujúcim výrokom:



Vyberte num z A, kde existuje (vyberte 1 z B, kde num=a.num)

14. Nie všetky indexy sú platné pre dotazy, SQL je založený na dátach v tabuľke na optimalizáciu dotazu, keď má indexový stĺpec veľké množstvo duplicity dát, SQL dotazy nemusia index používať, napríklad tabuľka má pohlavie poľa, samec a žena sú takmer polovicou, potom aj keď je index postavený na pohlaví, nebude hrať úlohu v efektivite dotazov.



15. Čím viac indexov nie je, tým lepšie, index určite môže zlepšiť efektivitu príslušného výberu, ale zároveň znižuje efektivitu vkladania a aktualizácie, pretože index môže byť pri vkladaní alebo aktualizácii znovu zostavovaný, takže spôsob vytvorenia indexu je potrebné starostlivo zvážiť v závislosti od konkrétnej situácie. Najlepšie je mať v tabuľke viac ako 6 indexov, a ak ich je príliš veľa, zvážte, či je potrebné vytvárať indexy na niektorých zriedkavo používaných stĺpcoch.



16. Vyhýbajte sa aktualizáciám zoskupených indexových dátových stĺpcov, pokiaľ je to možné, pretože poradie zoskupených indexových dátových stĺpcov je fyzické poradie ukladania záznamov v tabuľkách, a keď sa hodnota stĺpca zmení, povedie to k úprave poradia celých záznamov tabuľky, čo spotrebuje značné zdroje. Ak vaša aplikácia potrebuje často aktualizovať zhlukované indexové stĺpce, musíte zvážiť, či by ste nemali vytvoriť index ako zhlukovaný index.



17. Snažte sa používať číselné polia a nenavrhovať polia, ktoré obsahujú iba číselné informácie ako znaky, čo zníži výkon dotazov a spojení a zvýši režijné náklady na úložisko. Je to preto, že engine porovnáva každý znak v reťazci jeden po druhom pri spracovaní dotazov a spojení, zatiaľ čo pre číselné typy je potrebné porovnať iba raz.



18. Používajte varchar/nvarchar namiesto char/nchar čo najviac, pretože po prvé, dlhší úložný priestor v poli môže ušetriť miesto, a po druhé, pri dotazoch je efektivita vyhľadávania v relatívne malom poli zjavne vyššia.



19. Nepoužívajte výber * z t, nahraďte "*" konkrétnym zoznamom polí a nevracajte žiadne polia, ktoré nie sú použité.



20. Skúste používať tabuľkové premenné namiesto dočasných tabuliek. Ak tabuľková premenná obsahuje veľké množstvo údajov, všimnite si, že index je veľmi obmedzený (iba primárny kľúčový index).



21. Vyhnite sa častému vytváraniu a mazaniu dočasných tabuliek, aby ste znížili spotrebu systémových tabuliek.

22. Dočasné tabuľky nie sú nepoužiteľné a ich správne použitie môže niektoré rutiny zefektívniť, napríklad keď potrebujete opakovane odkazovať na dátovú sadu vo veľkej alebo často používanej tabuľke. Pre jednorazové udalosti je však najlepšie použiť exportnú tabuľku.



23. Pri vytváraní dočasnej tabuľky, ak je množstvo dát vložených naraz veľké, môžete použiť select into namiesto create table, aby ste predišli zvýšeniu rýchlosti veľkého počtu logov; Ak množstvo dát nie je veľké, aby ste uľahčili zdroje systémovej tabuľky, mali by ste najskôr vytvoriť tabuľku a potom ju vložiť.



24. Ak sa používa dočasná tabuľka, uistite sa, že explicitne vymažete všetky dočasné tabuľky na konci uloženej procedúry, najskôr skrátite tabuľku a potom ju zrušte, aby ste predišli dlhodobému uzamknutiu systémovej tabuľky.



25. Snažte sa kurzor nepoužívať, pretože jeho účinnosť je nízka, ak dáta ovládané kurzorom presahujú 10 000 riadkov, mali by ste zvážiť prepísanie.



26. Riešenia založené na množinách by sa mali hľadať na riešenie problémov pred použitím metód založených na kurzore alebo dočasných tabuliek, ktoré sú často efektívnejšie.



27. Rovnako ako dočasné tabuľky, kurzory nie sú nepoužiteľné. Používanie FAST_FORWARD kurzorov pre malé dátové súbory je často lepšie ako iné metódy spracovania riadok po riadku, najmä ak musíte odkazovať na viacero tabuliek, aby ste získali potrebné dáta. Rutiny, ktoré obsahujú "total" vo výslednej množine, sú zvyčajne rýchlejšie ako tie, ktoré sa vykonávajú kurzorom. Ak to vývojový čas dovolí, možno vyskúšať metódy založené na kurzoroch aj množinách, aby sa zistilo, ktorá funguje lepšie.



28. Nastavte NASTAVIŤ NOCOUNT ON na začiatku všetkých uložených procedúr a spúšťačov a na konci NASTAVIŤ NOCOUNT OFF. Nie je potrebné posielať klientovi DONE_IN_PROC správ po vykonaní každého príkazu uloženej procedúry a spúšťača.



29. Snažiť sa vyhnúť veľkým transakčným operáciám a zlepšiť kapacitu súbežnosti systému.



30. Snažte sa vyhnúť vráteniu veľkých dát klientovi, ak je objem dát príliš veľký, mali by ste zvážiť, či je zodpovedajúca požiadavka primeraná.




Predchádzajúci:Systém CentOS 6.5 s virtuálnym strojom Xen 4.1.2
Budúci:Ako zlepšiť rýchlosť dotazov na SQL Server
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com