1. Norėdami optimizuoti užklausą, turėtumėte stengtis išvengti visos lentelės nuskaitymo ir pirmiausia apsvarstyti galimybę sukurti indeksą stulpeliuose, kuriuose nurodoma, kur ir pagal kuriuos reikia rikiuotis.
2. Stenkitės išvengti nulinės vertės vertinimo laukuose where sąlyga, kitaip variklis atsisakys indeksų naudojimo ir atliks visą lentelės nuskaitymą, pvz.:
Pasirinkite ID iš T, kur Num yra neapibrėžtas
Galite nustatyti numatytąją skaičių reikšmę 0, įsitikinti, kad lentelės stulpelyje nr nėra nulinės reikšmės, ir tada užklausti taip:
Pasirinkite ID iš t, kur num=0
3. Stenkitės nenaudoti != arba <> operatorių where sąlygoje, kitaip variklis atsisakys indeksų naudojimo ir atliks visos lentelės nuskaitymą.
4. Turėtumėte stengtis nenaudoti OR kur sąlygoje, kad sujungtumėte sąlygą, kitaip variklis atsisakys indeksų naudojimo ir atliks visą lentelės nuskaitymą, pvz.:
Pasirinkite ID iš t, kur num=10 arba num=20
Galite pateikti tokią užklausą:
Pasirinkite ID iš t, kur num=10
Sąjunga visi
Pasirinkite ID iš t, kur num=20
5.in ir ne taip pat turėtų būti naudojami atsargiai, kitaip bus nuskaityta visa lentelė, pvz.:
Pasirinkite ID iš T, kur Num In(1,2,3)
Nuolatinėms reikšmėms nenaudokite, jei galite naudoti tarp:
Pasirinkite ID iš t, kur skaičius nuo 1 iki 3
6. Atlikus šią užklausą taip pat bus nuskaityta visa lentelė:
Pasirinkite ID iš t, kur pavadinimas pvz., '%abc%'
Norėdami pagerinti efektyvumą, apsvarstykite galimybę ieškoti viso teksto.
7. Jei naudosite parametrą kur sąlygoje, jis taip pat sukels visos lentelės nuskaitymą. Kadangi SQL išsprendžia tik vietinius kintamuosius vykdymo metu, tačiau optimizatorius negali atidėti prieigos planų pasirinkimo vykdymo laikui; Jis turi būti pasirinktas kompiliavimo metu. Tačiau, jei kompiliavimo metu nustatomas prieigos planas, kintamojo reikšmė vis dar nežinoma, todėl negali būti naudojama kaip įvesties elementas indekso pasirinkimui. Bus nuskaityti visi šie teiginiai:
Pasirinkite ID iš t, kur num=@num
Galite priversti užklausą naudoti indeksą:
Pasirinkite ID iš t su(index(index(index pavadinimas)) kur num=@num
8. Stenkitės vengti išreikšti laukus kur sąlygoje, dėl kurios variklis atsisakys indeksų naudojimo visos lentelės nuskaitymo naudai. Pavyzdžiui:
Pasirinkite ID iš t, kur num/2=100
turėtų būti pakeistas į:
Pasirinkite ID iš t, kur num=100*2
9. Stenkitės vengti atlikti funkcines operacijas laukuose, esančiuose kur sąlygoje, nes variklis atsisakys indeksų naudojimo ir naudos visą lentelės nuskaitymą. Pavyzdžiui:
Pasirinkite ID iš t, kur substring(name,1,3)='abc' --name id, prasidedantis abc
Pasirinkite ID iš t, kur datediff(day,createdate,'2005-11-30')=0--'2005-11-30' sugeneruotas ID
turėtų būti pakeistas į:
Pasirinkite ID iš t, kur pavadinimas, pvz., 'abc%'
Pasirinkite ID iš T, kur sukurta>='2005-11-30' ir sukurta<'2005-12-1'
10. Neatlikite funkcijų, aritmetinių operacijų ar kitų išraiškos operacijų kairėje nuo "=" sakinyje where, kitaip sistema gali nesugebėti tinkamai naudoti indekso.
11. Naudojant indekso lauką kaip sąlygą, jei indeksas yra sudėtinis indeksas, tada pirmasis indekso laukas turi būti naudojamas kaip sąlyga, siekiant užtikrinti, kad sistema naudotų indeksą, kitaip indeksas nebus naudojamas, o laukų tvarka turėtų kiek įmanoma atitikti indekso tvarką.
12. Nerašykite beprasmių užklausų, pvz., sukurkite tuščios lentelės struktūrą:
Pasirinkite col1,col2 į #t iš t, kur 1=0
Šio tipo kodas nepateikia jokio rezultatų rinkinio, tačiau sunaudoja sistemos išteklius, todėl jį reikia pakeisti į kažką panašaus:
Kurti lentelę #t(...)
13. Daug kartų tai yra geras pasirinkimas pakeisti egzistuoja:
Pasirinkite NUM iš kur NUM IN(Pasirinkite NUM iš b)
Pakeisti šiuo teiginiu:
Pasirinkite num iš a, kur yra(pasirinkite 1 iš b, kur num=a.num)
14. Ne visi indeksai galioja užklausoms, SQL yra pagrįstas lentelės duomenimis, kad būtų optimizuota užklausa, kai indekso stulpelyje yra daug duomenų dubliavimosi, SQL užklausos gali nenaudoti indekso, pvz., lentelėje yra lauko lytis, vyras, moteris yra beveik po pusę, tada net jei indeksas yra sukurtas pagal lytį, jis neturės įtakos užklausos efektyvumui.
15. Kuo daugiau indeksų nėra geriau, indeksas tikrai gali pagerinti atitinkamo pasirinkimo efektyvumą, tačiau taip pat sumažina įterpimo ir atnaujinimo efektyvumą, nes indeksas gali būti atstatytas įterpiant ar atnaujinant, todėl reikia atidžiai apsvarstyti, kaip sudaryti indeksą, atsižvelgiant į konkrečią situaciją. Geriausia lentelėje neturėti daugiau nei 6 indeksų, o jei jų yra per daug, apsvarstykite, ar reikia kurti indeksus kai kuriuose retai naudojamuose stulpeliuose.
16. Kiek įmanoma venkite atnaujinti sugrupuotus indekso duomenų stulpelius, nes sugrupuotų indekso duomenų stulpelių tvarka yra fizinė lentelės įrašų saugojimo tvarka, o pasikeitus stulpelio reikšmei, reikės koreguoti visų lentelės įrašų tvarką, o tai sunaudos daug išteklių. Jei jūsų programai reikia dažnai atnaujinti sugrupuotus indekso stulpelius, turite apsvarstyti, ar turėtumėte kurti indeksą kaip sugrupuotą indeksą.
17. Stenkitės naudoti skaitinius laukus ir stenkitės nekurti laukų, kuriuose yra tik skaitinė informacija kaip simboliai, o tai sumažins užklausų ir ryšių našumą bei padidins saugyklos išlaidas. Taip yra todėl, kad variklis lygina kiekvieną eilutės simbolį po vieną, apdorodamas užklausas ir sujungimus, o skaitiniams tipams jį reikia palyginti tik vieną kartą.
18. Kiek įmanoma naudokite varchar/nvarchar, o ne char/nchar, nes, pirma, ilgesnė lauko saugykla gali sutaupyti vietos saugykloje, antra, užklausų paieškos efektyvumas santykinai mažame lauke yra akivaizdžiai didesnis.
19. Nenaudokite pasirinkimo * iš t niekur, pakeiskite "*" konkrečiu laukų sąrašu ir negrąžinkite nenaudojamų laukų.
20. Pabandykite naudoti lentelės kintamuosius, o ne laikinas lenteles. Jei lentelės kintamajame yra didelis duomenų kiekis, atkreipkite dėmesį, kad indeksas yra labai ribotas (tik pirminio rakto indeksas).
21. Venkite dažnai kurti ir naikinti laikinąsias lenteles, kad sumažintumėte sistemos lentelės išteklių sunaudojimą.
22. Laikinos lentelės nėra netinkamos naudoti, o tinkamai jas naudojant kai kurios procedūros gali būti efektyvesnės, pavyzdžiui, kai reikia pakartotinai nurodyti duomenų rinkinį didelėje lentelėje arba dažniausiai naudojamoje lentelėje. Tačiau vienkartiniams įvykiams geriausia naudoti eksportavimo lentelę.
23. Kurdami laikiną lentelę, jei vienu metu įterptų duomenų kiekis yra didelis, galite naudoti pasirinkti į, o ne sukurti lentelę, kad išvengtumėte didelio žurnalų skaičiaus, kad pagerintumėte greitį; Jei duomenų kiekis nėra didelis, norėdami palengvinti sistemos lentelės išteklius, pirmiausia turėtumėte sukurti lentelę, o tada įterpti.
24. Jei naudojama laikina lentelė, saugomos procedūros pabaigoje būtinai ištrinkite visas laikinąsias lenteles, pirmiausia sutrumpinkite lentelę, o tada numeskite lentelę, kad sistemos lentelė nebūtų užrakinta ilgą laiką.
25. Stenkitės vengti žymeklio naudojimo, nes žymeklio efektyvumas yra prastas, jei žymeklio valdomi duomenys viršija 10 000 eilučių, turėtumėte apsvarstyti galimybę perrašyti.
26. Prieš naudojant žymekliu pagrįstus arba laikinus lentelės metodus, kurie dažnai yra efektyvesni, reikia ieškoti rinkinių sprendimų, kaip išspręsti problemas.
27. Kaip ir laikinos lentelės, žymekliai nėra netinkami naudoti. Naudoti FAST_FORWARD žymeklius mažiems duomenų rinkiniams dažnai yra geriau nei kitus eilutės apdorojimo metodus, ypač jei turite nurodyti kelias lenteles, kad gautumėte reikiamus duomenis. Procedūros, kuriose rezultatų rinkinyje yra "total", paprastai yra greitesnės nei tos, kurios vykdomos žymekliu. Jei kūrimo laikas leidžia, galima pabandyti ir žymekliu, ir rinkiniu pagrįstus metodus, kad pamatytumėte, kuris veikia geriau.
28. Visų saugomų procedūrų ir paleidiklių pradžioje nustatykite SET NOCOUNT ON, o pabaigoje – SET NOCOUNT OFF. Įvykdžius kiekvieną saugomos procedūros ir paleidiklio teiginį, klientui nereikia siųsti DONE_IN_PROC pranešimų.
29. Stenkitės vengti didelių operacijų operacijų ir pagerinti sistemos sutapimo pajėgumą.
30. Stenkitės vengti didelių duomenų grąžinimo klientui, jei duomenų kiekis yra per didelis, turėtumėte apsvarstyti, ar atitinkamas reikalavimas yra pagrįstas. |