sql >> Databasteknik >  >> RDS >> Sqlserver

Hur kan jag tvinga en underfråga att fungera lika bra som en #temp-tabell?

Det finns några möjliga förklaringar till varför du ser detta beteende. Några vanliga är

  1. Underfrågan eller CTE kan utvärderas upprepade gånger.
  2. Materialiserar partiella resultat till en #temp tabell kan tvinga fram en mer optimal sammanfogningsordning för den delen av planen genom att ta bort några möjliga alternativ från ekvationen.
  3. Materialiserar partiella resultat till en #temp tabellen kan förbättra resten av planen genom att korrigera dåliga uppskattningar av kardinalitet.

Den mest tillförlitliga metoden är helt enkelt att använda en #temp bord och materialisera det själv.

Om det inte gäller punkt 1, se Ge en ledtråd för att tvinga fram mellanliggande materialisering av CTE eller härledda tabeller . Användningen av TOP(large_number) ... ORDER BY kan ofta uppmuntra resultatet att spoolas i stället för att upprepade gånger omvärderas.

Även om det fungerar så finns det ingen statistik på spolen.

För punkterna 2 och 3 skulle du behöva analysera varför du inte fick den önskade planen. Om du eventuellt skriver om frågan för att använda sargbara predikat eller att uppdatera statistik kan det bli en bättre plan. Om det misslyckas kan du försöka använda frågetips för att få önskad plan.



  1. Ersätt i MySQL

  2. Hur man optimerar en SQL-uppdatering som körs på en Oracle-tabell med 700 miljoner rader

  3. Hur man skyddar MySQL-databaser från Ransomware-kampanjer

  4. Problem med att lagra värde i databasen