Nya varningar i SQL Servers exekveringsplan

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

När man utvecklar SQL-kod är det en god vana att alltid kontrollera exekveringsplanen, även om frågan ser enkel ut. I vissa lägen ger SQL Server tips på vad som kan behöva åtgärdas genom att visa små gula varningssymboler på ikonerna. I SQL Server 2012 får du ytterligare lite hjälp med nya varningar. En sådan är när konverteringar mellan datatyper riskerar att generera fel exekveringsplan. Det inträffar om man har en slarvigt skapad tabell med heltal lagrade i kolumner av typen varchar (eller char). Om man t.ex. gör ett urval med ett heltal så kommer SQL Server inte att kunna använda eventuellt index. För att testa skapar jag två enkla tabeller med heltal, en med datatyp varchar(10) och med integer.

Därefter ställer vi några frågor och tittar på resultatet i exekveringsplanen (tryck Ctrl+M innan för att få med exekveringspalen).

 

  

Resultat:

– Om vi använder samma datatyp i urvalets parameter som kolumnen har (fråga 1 och 2) används index som förväntat.
– Om parametern är varchar och kolumnen integer används också index (fråga 3).
– Om parametern är integer och kolumnen varchar så används däremot inte index (fråga 4)! Orsaken till problemet är att vid implicit konvertering mellan integer och varchar är det värdet i varchar som konverteras till integer. Och eftersom det i fråga 4 är en kolumn med varchar som är indexerad måste konverteringen göras för varje post i indexet. Då fyller det inte längre sin funktion – att minska antalet lästa rader och SQL Server väljer att läsa tabellen direkt.

Nytt i SQL Server 2012 är varningssymbolen på SELECT-ikonen och den hjälp man får genom att hålla markören över den. Av den framgår tydligt att det är den oönskade typkonverteringen som orsaker problemet. 

Så tänk efter före innan du väljer datatyp till en ny kolumn. Och ta för vana att kasta ett öga på exekveringsplanen efter varningar (det finns mycket mer att titta efter också, men det får vi ta en annan gång!)

Har du några frågor kring SQL Server – tveka inte att kontakta någon av SQL Service konsulter.