PostgreSQL - Optimalisatie van zoekopdrachten

Inhoudsopgave
Wanneer we veelvouden doen vragen In een complex systeem nemen we vaak niet de juiste route om optimale prestaties op databaseniveau te hebben, met de huidige technologische vooruitgang en de rekenkracht die we vaak in onze servers zien, kunnen we denken dat database-optimalisatie tot het verleden behoort.
Dit kan niet minder waar zijn, ondanks de vooruitgang in kracht van de apparatuur, zijn de databases van fundamenteel belang voor de prestaties van de applicaties, daarom kan een goed geschreven en sterk geoptimaliseerde query enkele seconden belasting betekenen die het bespaart in het systeem, als we dit vermenigvuldigen met het aantal gelijktijdige gebruikers, zien we hoe de kosten en het vermogen werden verspild.
Zoekopdrachten optimaliseren
De beste manier om de prestaties van onze databases te verbeteren is om te beginnen met goed geschreven zoekopdrachten, vaak vinden we dat de zoekopdrachten niet goed zijn geschreven omdat ze niet zo geoptimaliseerd zijn als ze zouden moeten zijn. Er zijn veel oorzaken hiervoor, een van hen is het hergebruik zonder codebewustzijn; Hiermee bedoelen we dat als we op een gegeven moment een query hebben gemaakt die voor ons werkt met a links meedoen We zullen het blijven toepassen bij het vergroten van het aantal te raadplegen tabellen, bij het wijzigen ervan en bij het wijzigen van enkele clausules door inner join Het kan het pad verkorten en het processorverbruik besparen.
SQL is een taal die, hoewel het vrij gemakkelijk te lezen is, veel aspecten en variaties heeft die ons in staat stellen om iets te doen dat op de beste en slechtste manier werkt, het is aan ons om te weten hoe we kunnen identificeren of onze oplossing toebehoort aan een categorie of iets anders.
Om te weten dat we op de goede weg zijn, is een van de belangrijkste dingen om te worden bijgewerkt, dat wil zeggen, we kunnen niet doorgaan met coderen in SQL binnen PostgreSQL alsof het de eerste versie is als we in de versie 9.
Over het gebruik van subquery's
Dit is een van de meest voorkomende fouten die we maken, en dat is dat we een query beschouwen als een reeks stukjes die we samenvoegen totdat we een eindresultaat krijgen, maar dit gedrag heeft een grote impact op de prestaties van onze database.
Laten we een voorbeeld van dit typische gedrag bekijken:
 SELECT tract_id, (SELECT COUNT (*) FROM census.facts As F WHERE F.tract_id = T.tract_id) As num_facts, (SELECT COUNT (*) FROM census.lu_fact_types As Y WHERE Y.fact_type_id IN (SELECT fact_type_id FROM census. feiten F WAAR F.tract_id = T.tract_id)) Als num_fact_types FROM census.lu_tracts Als T; 

Als we nu de grafiek van de LEG UIT Uit deze vraag zullen we ons realiseren hoe duur het is om het op deze manier te doen:

VERGROTEN

Zoals we kunnen zien, hebben we verschillende punten die knelpunten zijn in deze query, afgezien van alle gegevens die inefficiënt moeten worden verplaatst, hiervoor gaan we deze op een meer optimale manier herschrijven en vergelijken met een nieuwe grafiek van de LEG UIT.
 SELECT T.tract_id, COUNT (f.fact_type_id) As num_facts, COUNT (DISTINCT fact_type_id) As num_fact_types FROM census.lu_tracts As T LEFT JOIN census.facts As F ON T.tract_id = F.tract_id GROEP OP T.tract_id; 

In deze nieuwe versie van onze query vermijden we het gebruik van subquery's, in plaats daarvan doen we een equivalent met links meedoen Y groeperen opAls we de grafiek zien, kunnen we het verschil zien.

VERGROTEN

We kunnen zien hoe de manier om ons resultaat te verkrijgen veel korter is geweest, wat ons een hogere prestatie geeft, hiermee bedoelen we niet dat we de subquery's van onze werktools moeten uitsluiten, maar eerder dat we ons ervan bewust moeten zijn dat ze bestaan ​​er betere paden voor wat we op dit moment misschien voorstellen.Vond je deze tutorial leuk en hielp je hem?Je kunt de auteur belonen door op deze knop te drukken om hem een ​​positief punt te geven
wave wave wave wave wave