SQL Query Performance
in dit specifieke geval zult u geen groot verschil merken omdat 30.000 rijen niet te moeilijk zijn voor de database om te verwerken. Echter, als je het had over honderden miljoenen rijen of meer, zou je een merkbare verbetering te zien door aggregeren voordat je lid wordt. Wanneer u dit doet, zorg ervoor dat wat je doet is logisch consistent — u moet zorgen over de nauwkeurigheid van uw werk voordat u zich zorgen over run snelheid.
13 tips voor QUERY-prestaties
vergeet niet objectnamen voor te voegen (d.w.z. tabel, opgeslagen procedure, weergave) met de eigenaar / schemanaam.
reden: als de eigenaar / schemanaam niet wordt opgegeven, probeert de engine van SQL Server het in alle schema ‘ s te vinden totdat het object het vindt. SQL Server engine zal niet zoeken naar de tabel buiten de eigenaar / schema als de eigenaar / schema naam is opgegeven.
de * Operator
gebruik de * operator niet in uw SELECT statements. Gebruik in plaats daarvan kolomnamen.
reden: SQL Server scant voor alle kolomnamen en vervangt de * door alle kolomnamen van de tabel (en) in het SQL SELECT-statement. Het verstrekken van kolomnamen voorkomt dit zoeken-en-vervangen en verbetert de prestaties.
Nullabelbare kolommen
vermijd het gebruik van niet IN bij vergelijking met nullabelbare kolommen. Gebruik in plaats daarvan bestaat niet.
reden: wanneer niet IN wordt gebruikt in de query (zelfs als de query geen rijen retourneert met de null-waarden), zal SQL Server elk resultaat controleren om te zien of het null is of niet. Het gebruik van NOT EXISTS zal de vergelijking met nulls niet doen. Ook, NOT EXISTS geeft slechts twee staten (true of false), terwijl NOT IN kan terugkeren tot drie staten (true, false, NULL) en misschien niet geven u het resultaat dat u verwachtte.
tabelvariabelen en Joins
vermijd het gebruik van tabelvariabelen in joins. Gebruik in plaats daarvan tijdelijke tabellen, CTEs (Common Table Expressions) of afgeleide tabellen in joins.
reden: hoewel tabelvariabelen in veel situaties zeer snel en efficiënt zijn, ziet de SQL Server-engine het als een enkele rij. Vanwege deze reden zal SQL een uitvoeringsplan produceren dat verschrikkelijk zal presteren wanneer het wordt gebruikt in joins.
opgeslagen Procedure Namen
begin de naam van uw opgeslagen procedure niet met sp_.
reden: als de opgeslagen procedure sp_ of SP_ heet, controleert SQL Server altijd in de systeem / master database, zelfs als de eigenaar / schemanaam wordt opgegeven. Het verstrekken van een naam zonder SP_ aan een opgeslagen procedure voorkomt deze onnodige controle in de systeem/master database in SQL Server.
gebruik SET NOCOUNT op
Gebruik SET NOCOUNT op met DML-operaties.
reden: bij het uitvoeren van DML-operaties (d.w.z. Invoegen, Verwijderen, selecteren en bijwerken), geeft SQL Server altijd het aantal betrokken rijen terug. In complexe query ‘ s met veel joins, dit wordt een enorme prestatie probleem. Het gebruik van SET NOCOUNT ON zal de prestaties verbeteren, omdat het niet het aantal betrokken rijen zal bijhouden.
vermijd het gebruik van groep volgens, volgorde volgens EN verschillend
vermijd het gebruik van groep volgens, volgorde volgens EN verschillend indien mogelijk.
reden: bij gebruik van GROUP BY, ORDER BY of DISTINCT, maakt de SQL Server-engine een werktabel aan en plaatst de gegevens op de werktabel. Daarna organiseert het deze gegevens in de werktabel zoals gevraagd door de query en retourneert het het eindresultaat.
Controleer indexen
er moeten indexen zijn op alle velden die worden gebruikt in de WHERE en JOIN delen van de SQL statement.
reden: als velden niet geïndexeerd zijn, zal SQL Server doorgaans een volledige tabelscan uitvoeren en dit kan de prestaties verminderen. Tenzij de tabel is zeer klein, een tabel scan heeft de neiging om de slechtste prestaties van alle soorten database leest opleveren.
gebruik hetzelfde Datatype op JOIN en waar clausules
dit is gemakkelijker gezegd dan gedaan, afhankelijk van uw rechten om wijzigingen aan te brengen in het schema.
reden: bij het samenvoegen of vergelijken van twee velden met verschillende datatypes, moet SQL een on-the-fly conversie van het veld uitvoeren voordat het een vergelijking kan maken, zelfs als de velden geïndexeerd zijn. Als niet-overeenkomende datatypes onvermijdelijk zijn, probeer dan waar mogelijk het grotere datatype naar het kleinere datatype te casten.
vermijd het gebruik van berekende velden in JOIN en waar clausules
dit kan worden gedaan door het creëren van een veld met de berekende waarden gebruikt in de join op de tabel. Zie hieronder.