sql >> Databasteknik >  >> RDS >> Sqlserver

Finns det en prestandaskillnad mellan CTE , Sub-Query, Temporary tabell eller Tabellvariabel?

SQL är ett deklarativt språk, inte ett procedurspråk. Det vill säga, du konstruerar en SQL-sats för att beskriva de resultat du vill ha. Du berättar inte för SQL-motorn hur att göra jobbet.

Som en allmän regel är det en bra idé att låta SQL-motorn och SQL-optimeraren hitta den bästa frågeplanen. Det finns många års ansträngning för att utveckla en SQL-motor, så låt ingenjörerna göra vad de vet hur de ska göra.

Naturligtvis finns det situationer där frågeplanen inte är optimal. Sedan vill du använda frågetips, strukturera om frågan, uppdatera statistik, använda tillfälliga tabeller, lägga till index och så vidare för att få bättre prestanda.

När det gäller din fråga. Prestandan för CTE:er och underfrågor bör i teorin vara densamma eftersom båda ger samma information till frågeoptimeraren. En skillnad är att en CTE som används mer än en gång lätt kan identifieras och beräknas en gång. Resultaten kan sedan lagras och läsas flera gånger. Tyvärr verkar SQL Server inte dra fördel av denna grundläggande optimeringsmetod (du kan kalla detta för eliminering av vanliga underfrågor).

Tillfälliga tabeller är en annan sak, eftersom du ger mer vägledning om hur frågan ska köras. En stor skillnad är att optimeraren kan använda statistik från den tillfälliga tabellen för att upprätta sin frågeplan. Detta kan resultera i prestationsvinster. Dessutom, om du har en komplicerad CTE (subquery) som används mer än en gång, då kommer att lagra den i en tillfällig tabell ofta ge en prestandaökning. Frågan körs endast en gång.

Svaret på din fråga är att du måste leka för att få den prestanda du förväntar dig, särskilt för komplexa frågor som körs regelbundet. I en idealisk värld skulle frågeoptimeraren hitta den perfekta exekveringsvägen. Även om det ofta gör det, kanske du kan hitta ett sätt att få bättre prestanda.



  1. Proaktiva SQL Server Health Checks, Del 3:Inställningar för instans och databas

  2. Automatisera säkerhetsgranskningar för PostgreSQL

  3. Tillkännager ClusterControl 1.7.2:Förbättrad PostgreSQL Backup &Support för TimescaleDB &MySQL 8.0

  4. Hur man undviker tabellmuteringsfel