Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 10757|Antwoord: 0

[Bron] 30 punten om de SQL-querysnelheid te verbeteren

[Link kopiëren]
Geplaatst op 27-01-2015 20:09:54 | | |

1. Om de query te optimaliseren, moet je proberen volledige tabel scannen te vermijden en eerst overwegen een index te maken van de kolommen die betrokken zijn in waar en volgorde.



2. Probeer null value judgment te vermijden op velden in de where-clausule, anders zal de engine stoppen met indexen en volledige tabelscanning uitvoeren, zoals:

Selecteer ID uit T waar Num null is

Je kunt de standaardwaarde 0 instellen op het num, ervoor zorgen dat er geen nullwaarde in de numkolom in de tabel staat, en dan zo'n query doen:

Selecteer ID uit t waarbij num=0



3. Probeer het gebruik van != of <>-operatoren in de where-clausule te vermijden, anders stopt de engine met het gebruik van indexen en voert full-table scanning uit.



4. Je moet proberen OR niet te gebruiken in de where-clausule om de conditie te joinen, anders zal de engine het gebruik van indexen opgeven en een volledige tabelscan uitvoeren, zoals:

Selecteer ID uit T waarbij num=10 of num=20

Je kunt zo'n vraag stellen:

Selecteer ID uit T waar num=10

Unie ALL

Selecteer ID uit t waarbij num=20



5.in en niet in moet ook met voorzichtigheid worden gebruikt, anders leidt het tot volledige tafelscanning, zoals:

Selecteer ID uit t waar num in(1,2,3)

Voor continue waarden gebruik je niet in als je kunt gebruiken tussen:

Selecteer ID uit T waar Num tussen 1 en 3 ligt



6. De volgende query zal ook resulteren in een volledige tabelscan:

Selecteer ID uit T waar naam zoals '%abc%'

Om de efficiëntie te verbeteren, overweeg full-text search.



7. Als je een parameter gebruikt in een where-clausule, veroorzaakt dat ook een volledige tabelscan. Omdat SQL alleen lokale variabelen tijdens runtime oplost, maar de optimizer de selectie van toegangsplannen niet naar runtime kan uitstellen; Het moet bij het compileren worden geselecteerd. Als er echter een toegangsplan wordt opgesteld tijdens het compileren tijd, is de waarde van de variabele nog steeds onbekend en kan daarom niet als invoeritem voor indexselectie worden gebruikt. De volgende verklaringen worden volledig gescand:

Selecteer ID uit T waar num=@num

Je kunt de query dwingen om in plaats daarvan een index te gebruiken:

Selecteer ID uit T met(index(index(indexnaam)) waarbij num=@num



8. Probeer velden in de where-clausule niet uit te drukken, wat ertoe leidt dat de engine het gebruik van indexen opgeeft ten gunste van volledige tabelscanning. Bijvoorbeeld:

Selecteer ID uit T waar num/2=100

moet worden gewijzigd in:

Selecteer ID uit T waar num=100*2



9. Probeer het uitvoeren van functiebewerkingen op velden in de where-clausule te vermijden, wat ertoe zal leiden dat de engine het gebruik van indexen opgeeft ten gunste van volledige tabelscanning. Bijvoorbeeld:

Selecteer ID uit t waarbij substring(name,1,3)='abc' --naam-id dat begint met abc

Selecteer ID uit T waar datediff(Day,CreateDate,'2005-11-30')=0--'2005-11-30' gegenereerde ID

moet worden gewijzigd in:

Selecteer ID uit T waar naam zoals 'abc%'

Selecteer ID uit T waar CreateDate>='2005-11-30' en CreateDate<'2005-12-1'



10. Voer geen functies, rekenkundige bewerkingen of andere expressiebewerkingen uit links van de "=" in de where-clausule, anders kan het systeem de index mogelijk niet correct gebruiken.



11. Bij het gebruik van een indexveld als voorwaarde, als de index een samengestelde index is, moet het eerste veld in de index als voorwaarde worden gebruikt om ervoor te zorgen dat het systeem de index gebruikt, anders wordt de index niet gebruikt, en moet de volgorde van de velden zoveel mogelijk consistent zijn met de indexvolgorde.



12. Schrijf geen betekenisloze zoekopdrachten, zoals het genereren van een lege tabelstructuur:

Selecteer col1,col2 in #t uit t waarbij 1=0

Dit type code geeft geen enkele resultaatset terug, maar verbruikt wel systeembronnen, dus het zou moeten worden aangepast naar iets als dit:

maak een tabel aan #t(...)



13. Vaak is het een goede keuze om te vervangen door bestaan:

Selecteer Num uit A Waar Num In (Selecteer Num uit B)

Vervang door de volgende uitspraak:



Selecteer Num uit A waar bestaat (selecteer 1 uit B waar Num=A.Num)

14. Niet alle indexen zijn geldig voor queries, SQL is gebaseerd op de data in de tabel om de query te optimaliseren; wanneer de indexkolom veel dataduplicatie bevat, gebruiken SQL-queries mogelijk geen index, bijvoorbeeld een tabel met een veld, waarbij geslacht, man, vrouw bijna de helft is, en zelfs als de index op geslacht is gebouwd, zal het geen rol spelen in de efficiëntie van zoekopdrachten.



15. Hoe meer indexen niet zijn, hoe beter, de index kan zeker de efficiëntie van de bijbehorende selectie verbeteren, maar vermindert ook de efficiëntie van inserten en updaten, omdat de index kan worden herbouwd bij inserts of updates, dus hoe een index gebouwd moet worden, afhankelijk van de specifieke situatie. Het is het beste om niet meer dan 6 indexen in een tabel te hebben, en als er te veel zijn, overweeg dan of het nodig is indexen te bouwen op enkele zelden gebruikte kolommen.



16. Vermijd het zo veel mogelijk bij te werken van geclusterde indexdatakolommen, omdat de volgorde van geclusterde indexdatakolommen de fysieke opslagvolgorde van tabelrecords is, en zodra de kolomwaarde verandert, leidt dit tot het aanpassen van de volgorde van de volledige tabelrecords, wat aanzienlijke middelen zal kosten. Als je applicatie vaak geclusterde indexkolommen moet bijwerken, moet je overwegen of je de index als een geclusterde index moet bouwen.



17. Probeer numerieke velden te gebruiken en probeer geen velden te ontwerpen die alleen numerieke informatie als tekens bevatten, wat de prestaties van queries en verbindingen vermindert en de opslagoverhead verhoogt. Dit komt doordat de engine elk teken in de string één voor één vergelijkt bij het verwerken van queries en joins, terwijl het voor numerieke types slechts één keer vergeleken hoeft te worden.



18. Gebruik varchar/nvarchar in plaats van char/nchar zoveel mogelijk, want ten eerste kan de langere veldopslagruimte opslagruimte besparen, en ten tweede is de zoekefficiëntie in een relatief klein veld voor queries uiteraard hoger.



19. Gebruik nergens selecteer * uit t, vervang "*" door een specifieke lijst velden, en geef geen velden terug die niet gebruikt zijn.



20. Probeer tabelvariabelen te gebruiken in plaats van tijdelijke tabellen. Als de tabelvariabele een grote hoeveelheid data bevat, let dan op dat de index zeer beperkt is (alleen de primaire sleutelindex).



21. Vermijd het vaak aanmaken en verwijderen van tijdelijke tabellen om het verbruik van systeemtabelbronnen te verminderen.

22. Tijdelijke tabellen zijn niet onbruikbaar, en het correct gebruiken ervan kan sommige routines effectiever maken, bijvoorbeeld wanneer je herhaaldelijk moet verwijzen naar een dataset in een grote of veelgebruikte tabel. Voor eenmalige gebeurtenissen is het echter het beste om een exporttabel te gebruiken.



23. Bij het aanmaken van een tijdelijke tabel, als de hoeveelheid data die tegelijk is ingevoegd groot is, kun je selecteren in gebruiken in plaats van een tabel aanmaken om te voorkomen dat er veel logs worden veroorzaakt om de snelheid te verbeteren; Als de hoeveelheid data niet groot is, moet je om de middelen van de systeemtabel te vergemakkelijken eerst een tabel aanmaken en dan invoegen.



24. Als een tijdelijke tabel wordt gebruikt, zorg er dan voor dat je expliciet alle tijdelijke tabellen aan het einde van de opgeslagen procedure verwijdert, de tabel eerst afsnijdt en vervolgens de tabel verwijdert, zodat de systeemtabel niet lange tijd wordt vergrendeld.



25. Probeer het gebruik van de cursor te vermijden, want de efficiëntie van de cursor is slecht; als de data die door de cursor wordt gebruikt meer dan 10.000 regels bedraagt, moet je overwegen om te herschrijven.



26. Set-gebaseerde oplossingen moeten worden gezocht om problemen op te lossen voordat cursorgebaseerde of tijdelijke tabelmethoden worden gebruikt, die vaak effectiever zijn.



27. Net als tijdelijke tabellen zijn cursors niet onbruikbaar. Het gebruik van FAST_FORWARD cursors voor kleine datasets is vaak beter dan andere rij-voor-rij verwerkingsmethoden, vooral als je meerdere tabellen moet raadplegen om de benodigde data te krijgen. Routines die "totaal" in de resultaatset bevatten, zijn meestal sneller dan die welke met de cursor worden uitgevoerd. Als de ontwikkeltijd het toelaat, kunnen zowel cursor-gebaseerde als set-gebaseerde methoden worden geprobeerd om te zien welke beter werkt.



28. STEL NOCOUNT AAN aan het begin van alle opgeslagen procedures en triggers, en SET NOCOUNT OFF aan het einde. Het is niet nodig om DONE_IN_PROC berichten naar de client te sturen nadat elke instructie van de opgeslagen procedure en trigger is uitgevoerd.



29. Probeer grote transacties te vermijden en de gelijktijdigheidscapaciteit van het systeem te verbeteren.



30. Probeer te voorkomen dat grote data naar de client wordt teruggestuurd; als het datavolume te groot is, moet je overwegen of de bijbehorende vraag redelijk is.




Vorig:CentOS 6.5-systeem met Xen 4.1.2 virtuele machine
Volgend:Hoe de querysnelheid van SQL Server te verbeteren
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com