Slechte databaseprestaties zijn een doorn in het oog van elke DBA. En het is niet altijd gemakkelijk om de oorzaak van prestatieproblemen te isoleren, wat de stress alleen maar vergroot.
Het afstemmen van uw SQL Server-databases is een geweldige manier om enkele van uw prestatieproblemen op te lossen, maar het is misschien niet altijd duidelijk waar u het optimalisatieproces moet starten. Als u schijfruimte, geheugen en andere moordenaars van netwerk- en hardwareprestaties uitsluit en uw SQL Server-prestaties nog steeds achterblijven, is het tijd om in uw vragen te graven.
Niet-geoptimaliseerde zoekopdrachten kunnen talloze prestatieproblemen voor uw systemen veroorzaken. Positief is dat een paar veelvoorkomende queryfouten verantwoordelijk zijn voor het grootste deel van de achteruitgang van de databaseprestaties.
Als uw vragen last hebben van een van deze zes problemen, bereid u dan voor op een serieuze prestatieafstemming.
Probleemquery nr. 1:Like-expressies met voorloopjokertekens
Voorlopende wildcards zorgen ervoor dat MySQL geen indexen gebruikt, waardoor een volledige tabelscan wordt afgedwongen, zelfs als u een veld in de tabel hebt geïndexeerd. Het scannen van alle rijen in een tabel vertraagt de levering van uw zoekopdrachtresultaten aanzienlijk, dus elimineer de leidende jokertekens om de efficiëntie te verbeteren.
Probleemquery nr. 2:niet-geïndexeerde kolommen die worden gebruikt in de clausules 'Waar' en 'Groeperen op'
Door kolommen te indexeren, kunnen queryresultaten sneller worden geretourneerd, omdat er geen volledige tabelscans meer nodig zijn. Indexeren helpt ook bij het sorteren van records wanneer ze worden geretourneerd en garandeert dat deze records uniek identificeerbaar zijn, wat vooral handig is in tabellen met meer dan 10 rijen.
Overweeg voor een beetje perspectief een "explain" -instructie in uw queryanalyse uit te voeren voor en na het indexeren. Dit geeft je een idee van hoeveel rijen met scannen je zojuist zelf hebt opgeslagen.
Probleemquery nr. 3:Zoals uitspraken die de 'of'-operator gebruiken in plaats van een vakbondsclausule
Query's uitvoeren met de vergelijkingsoperator "of" op velden of kolommen in een tabel kan handig zijn, maar het te vaak toepassen van "of" in een "where"-clausule is een andere snelle manier om een volledige tabel te scannen.
Een unie-clausule kan ervoor zorgen dat de SQL-query sneller wordt uitgevoerd, vooral als verschillende indexen elke kant van de query optimaliseren. In wezen neemt de union-operator de resultaten van twee snelle, geïndexeerde zoekopdrachten en voegt ze samen tot één.
Probleemquery nr. 4:Zoekopdrachten met jokertekens
Als u vastzit in een situatie waarin u met jokertekens moet zoeken, maar u niet de prestatiehit wilt nemen, probeer dan een MySQL-zoekopdracht in volledige tekst. Zoeken in volledige tekst is aanzienlijk sneller dan zoeken met jokertekens, en u krijgt het extra voordeel van relevantere resultaten bij het doorzoeken van enorme databases.
Probleemquery nr. 5:niet-geoptimaliseerd databaseschema
U kunt de prestaties van SQL-query's alleen zo verbeteren als u niet ook uw databaseschema optimaliseert. Hier zijn een paar tips voor verbetering:
Tabellen normaliseren
Gegevensredundantie doet afbreuk aan de prestaties, dus zorg ervoor dat u een feit slechts één keer in de database weergeeft. Als u bijvoorbeeld in meer dan één tabel naar een klant verwijst, gebruikt u 'klantnaam' slechts één keer en vervolgens 'klant-ID' voor volgende verwijzingen.
Gebruik optimale gegevenstypen
Enkele belangrijke punten om te onthouden als het gaat om gegevenstypen:
- Korter is beter bij het ontwerpen van tabellen. Gebruik bijvoorbeeld het gegevenstype "TINYINT" voor het veld "user_id" voor een systeemgebruikerstabel met minder dan 100 gebruikers.
- Gebruik het gegevenstype "date_time" als een veld een datumwaarde verwacht, zodat u de records achteraf niet naar datumnotatie hoeft te converteren.
- MySQL werkt beter met gehele waarden dan met tekstgegevenstypen, inclusief varchar.
Vermijd nulwaarden
Null-waarden in een kolom kunnen uw zoekopdrachtresultaten schaden, dus u moet mogelijk een standaardwaarde toewijzen voor velden waar records geen verplichte waarde vereisen.
Gebruik niet te veel kolommen
Brede tabellen (meer dan 100 kolommen) vereisen veel CPU en bronnen om te verwerken. Tenzij u absoluut een brede tabel moet opnemen, is het beter om deze op te splitsen in kleinere, logische tabellen.
Aanmeldingen optimaliseren
SQL-instructies met te veel joins (en joins met te veel tabellen) hebben een negatief effect op de prestaties. Schiet voor niet meer dan 12 joins voor elke zoekopdracht.
Probleemquery nr. 6:MySQL-query's zonder cache
Websites en applicaties die veel geselecteerde zoekopdrachten uitvoeren, hebben baat bij het cachen van MySQL-query's. MySQL-querycaching versnelt de prestaties tijdens leesbewerkingen omdat het de selectiequery naast de resulterende dataset in de cache plaatst en uit het geheugen (niet de schijf) haalt als de query meer dan eens wordt uitgevoerd.
Het afstemmen van prestaties is essentieel om een hoge beschikbaarheid voor uw SQL Server-databases te behouden en ervoor te zorgen dat uw eindgebruikers tevreden zijn. Maar helaas is het niet altijd meteen duidelijk waar afstemming het meest nodig is. Als je de voor de hand liggende netwerk- en hardwarebronnen voor prestatieproblemen hebt geëlimineerd, verschuif dan je aandacht naar je vragen.
Als u al geruime tijd als DBA werkt, bent u waarschijnlijk een (of alle) van deze probleemvragen tegengekomen. Nu u weet waar u op moet letten, kunt u proactief zijn in uw initiatief voor prestatieverbetering en corrigeren van deze veelvoorkomende pijnpunten in query's, zodat u de vruchten kunt plukken van SQL Server-queryoptimalisatie.