JorisR.be

JorisR.be

Code-Run-Beer-Repeat
22-3-2018

Tips voor snellere SQL statements

Bij complexe sql queries kan het voorkomen dat deze heel veel tijd nodig hebben om uitgevoerd te geraken.  In dit artikel wil ik een paar zaken onder de aandacht brengen die de uitvoeringstijd drastisch kunnen doen dalen.

  • Vraag enkel naar data die je nodig hebt.
    Dit kan je op een paar manieren bekijken.  Eerst en vooral de kolommen die je opvraagt, hebt je die allemaal nodig?  Het is onnutig om een "select *" te doen als je enkel 1 kolomn nodig hebt.
    Maar bekijk zeker en vast ook of je al de tabellen nodig hebt die in je statement staan.
    En ten slotte bekijk of je al de data nodig hebt, en je misschien een extra where clausule kunt inbouwen.
  • Bij zeer complexe queries kan het ook aangewezen zijn om een stored procedure te schrijven.  Het voordeel van een parameterloze stored procedure is dat sql server hiervoor standaard een executing plan voor bijhoudt en het deze niet meer moet berekenen.
  • Als je een ORM (entity framework, nHibernate,..) gebruikt, bekijk dan zeker de statements die deze maakt.  Soms is het aangewezen zelf een stored procedure aan te maken en deze te gebruiken dan gewoonweg op het ORM te vertrouwen.
  • Gebruik indexen: Bekijk je traagste queries, en bekijk bij elke table of het mogelijk is hier extra indexen aan toe te voegen.
  • Verwijder indexen: Indexen zijn niet alleen nuttig, deze kunnen ook tijd kosten bij updates en inserts: de index zal misschien ook gewijzigd moeten worden.  Ook kunnen teveel indexen ook zorgen voor teveel geheugenopslag.
    Bij queries met vooral updates en inserts, en relatief gezien weinig select statements is het hebben van een index meer een last dan een deugd.
  • Vermijd het gebruik van cursors.  Een cursor is heel tijdrovend, en in veel gevallen is deze te vervangen door een tijdelijke tabel.
  • Kies een goed data type.  Is een bigint echt nodig?  Voldoet een int niet?  Hetzelfde met nvarchar vs varchar.  Kies altijd het kleinste data type dat mogelijk is per kolom.
  • Als je enkel wil checken of een waarde bestaat, is het niet nodig heel de tabel te overlopen door bijvoorbeeld een count(*) te doen.  Gebruik liever het EXISTS statement.
  • Indien mogelijk gebruik joins in plaats van sub-queries.
  • Vermijd het gebruik van berekeningen in JOIN of WHERE clausule.  Indien mogelijk doe deze op voorhand al.
  • Als je de mogelijk hebt, gebruik verschillende filegroups, op verschillende fysieke disks, voor tabellen die vaak samen benaderd worden.  Zo kun je bijvoorbeeld al je logfiles in een andere filegroup zetten.
  • Een tip voor in SQL server editor zelf: bij veel updates, inserts: 'SET NOCOUNT ON', dit zorgt ervoor dat je geen informatie meer krijgt van hoeveel rijen er geinserteerd/geupdated zijn.
  • Als je op 1 tijdstip heel veel insert/updates moet doen, kan je tijdelijk index disable.  En na de updates/insert deze terug enablen. 
  • Andersom kan je ook tijdelijke indexen aanmaken, bijvoorbeeld indien er 1 keer per maand 20 rapporten gemaakt moeten worden.  Je creeërt een index, maaakt je rapporten, en verwijderd deze index.

    Maar de belangrijkste tip is wel: de sneltste query is de query die niet uitgevoerd moet worden.  Dus probeer waar mogelijk gegevens bij te houden in een cache, zodat je niet altijd dezelfde query moet laten uitvoeren.

Leave A Comment