sql >> Database >  >> RDS >> Sqlserver

Is er een prestatieverschil tussen CTE, subquery, tijdelijke tabel of tabelvariabele?

SQL is een declaratieve taal, geen proceduretaal. Dat wil zeggen, u maakt een SQL-instructie om de gewenste resultaten te beschrijven. Je vertelt de SQL-engine niet hoe om het werk te doen.

Als algemene regel is het een goed idee om de SQL-engine en de SQL-optimizer het beste queryplan te laten vinden. Het ontwikkelen van een SQL-engine kost vele mensjaren, dus laat de technici doen wat ze kunnen.

Natuurlijk zijn er situaties waarin het queryplan niet optimaal is. Vervolgens wilt u queryhints gebruiken, de query herstructureren, statistieken bijwerken, tijdelijke tabellen gebruiken, indexen toevoegen, enzovoort om betere prestaties te krijgen.

Wat betreft je vraag. De prestaties van CTE's en subquery's zouden in theorie hetzelfde moeten zijn, aangezien beide dezelfde informatie verstrekken aan de query-optimizer. Een verschil is dat een meer dan eens gebruikte CTE gemakkelijk kan worden geïdentificeerd en eenmaal kan worden berekend. De resultaten kunnen dan meerdere keren worden opgeslagen en gelezen. Helaas lijkt SQL Server geen gebruik te maken van deze basisoptimalisatiemethode (u zou deze algemene subquery-eliminatie kunnen noemen).

Tijdelijke tabellen zijn een andere zaak, omdat u meer richtlijnen geeft over hoe de query moet worden uitgevoerd. Een belangrijk verschil is dat de optimizer statistieken uit de tijdelijke tabel kan gebruiken om zijn queryplan op te stellen. Dit kan prestatiewinst opleveren. Als je een gecompliceerde CTE (subquery) hebt die meer dan eens wordt gebruikt, zal het opslaan ervan in een tijdelijke tabel vaak een prestatieverbetering geven. De zoekopdracht wordt slechts één keer uitgevoerd.

Het antwoord op uw vraag is dat u wat moet spelen om de prestaties te krijgen die u verwacht, met name voor complexe query's die regelmatig worden uitgevoerd. In een ideale wereld zou de query-optimizer het perfecte uitvoeringspad vinden. Hoewel dit vaak het geval is, kunt u misschien een manier vinden om betere prestaties te krijgen.



  1. MyBatis Lijstwaarden invoegen

  2. Exporteer en importeer alle MySQL-databases in één keer

  3. Meerdere rijen samenvoegen en groeperen in Oracle

  4. Verschil tussen Oracle jdbc-stuurprogrammaklassen?