Första Run
query
från Sql Server Management Studio
och titta på frågeplanen för att se var flaskhalsen är. Varje plats där du ser en "tabellskanning" eller "indexskanning" måste den gå igenom all data för att hitta det den letar efter. Om du skapar lämpliga index som kan användas för dessa operationer bör det öka prestandan.
Nedan listas några tips för att förbättra prestandan för sql-frågan..
Undvik flera kopplingar i en enda fråga
Försök att undvika att skriva en SQL-fråga med flera kopplingar som inkluderar yttre kopplingar, korsapplikation, yttre applikation och andra komplexa underfrågor. Det minskar möjligheterna för Optimizer att bestämma sammanfogningsordning och sammanfogningstyp. Ibland tvingas Optimizer använda kapslade loop-kopplingar, oavsett prestandakonsekvenserna för frågor med alltför komplexa korsapplikationer eller underfrågor.
Eliminera markörer från frågan Försök att ta bort markörer från frågan och använd uppsättningsbaserad fråga; uppsättningsbaserad fråga är effektivare än markörbaserad. Om det finns ett behov av att använda markören, undvik dynamiska markörer eftersom det tenderar att begränsa valet av planer som är tillgängliga för frågeoptimeraren. Till exempel begränsar dynamisk markör optimeraren till att använda kapslade loop-kopplingar.
Undvik användning av icke-korrelerad skalär underfråga Du kan skriva om din fråga för att ta bort icke-korrelerad skalär underfråga som en separat fråga istället för en del av huvudfrågan och lagra utdata i en variabel, som kan refereras till i huvudfrågan eller senare del av partiet. Detta kommer att ge bättre alternativ till Optimizer, vilket kan hjälpa till att returnera korrekta kardinalitetsuppskattningar tillsammans med en bättre plan.
Undvik multi-statement Table Valued Functions (TVF) TVF:er med flera uttalanden är dyrare än inline-TFV:er. SQL Server expanderar inline TFVs till huvudfrågan på samma sätt som den utökar vyer men utvärderar TVF:er med flera påståenden i ett separat sammanhang från huvudfrågan och materialiserar resultaten av flera påståenden till tillfälliga arbetstabeller. Det separata sammanhanget och arbetstabellen gör TVF:er med flera uttalanden kostsamma.
Skapa ett mycket selektivt index Selektivitet definierar procentandelen kvalificerande rader i tabellen (kvalificerande antal rader/totalt antal rader). Om förhållandet mellan det kvalificerande antalet rader och det totala antalet rader är lågt är indexet mycket selektivt och är mest användbart. Ett icke-klustrat index är mest användbart om förhållandet är runt 5 % eller mindre, vilket betyder att indexet kan eliminera 95 % av raderna från övervägande. Om index returnerar mer än 5 % av raderna i en tabell kommer det förmodligen inte att användas; antingen kommer ett annat index att väljas eller skapas eller så kommer tabellen att skannas.
Placera en kolumn i ett index Ordningen eller positionen för en kolumn i ett index spelar också en viktig roll för att förbättra SQL-frågeprestanda. Ett index kan hjälpa till att förbättra SQL-frågans prestanda om kriterierna för frågan matchar de kolumner som finns kvar mest i indexnyckeln. Som en bästa praxis bör de flesta selektiva kolumner placeras längst till vänster i nyckeln i ett icke-klustrat index.
Släpp oanvända index Att släppa oanvända index kan hjälpa till att påskynda dataändringar utan att påverka datahämtningen. Du måste också definiera en strategi för batchprocesser som körs sällan och använder vissa index. I sådana fall hjälper det att skapa index före batchprocesser och sedan släppa dem när batchprocesserna är klara för att minska överkostnaderna på databasen.
Skapa statistik och uppdateringar Du måste ta hand om statistikskapande och regelbundna uppdateringar för beräknade kolumner och flera kolumner som hänvisas till i frågan; frågeoptimeraren använder information om fördelningen av värden i en eller flera kolumner i en tabellstatistik för att uppskatta kardinaliteten, eller antalet rader, i frågeresultatet. Dessa kardinalitetsuppskattningar gör det möjligt för frågeoptimeraren att skapa en frågeplan av hög kvalitet.
Återgå till dina schemadefinitioner Sist men inte minst, se över dina schemadefinitioner; håll koll på att lämpliga FORIGEN KEY, NOT NULL och CEHCK-begränsningar finns på plats eller inte. Tillgänglighet av rätt begränsning på rätt plats hjälper alltid till att förbättra frågeprestandan, som FORIGEN KEY-begränsning hjälper till att förenkla kopplingar genom att konvertera några yttre eller semi-joins till inre kopplingar och CHECK-begränsning hjälper också lite genom att ta bort onödiga eller överflödiga predikat.