sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan kan jeg tvinge en underforespørgsel til at fungere så godt som en #temp-tabel?

Der er et par mulige forklaringer på, hvorfor du ser denne adfærd. Nogle almindelige er

  1. Underforespørgslen eller CTE bliver muligvis revurderet gentagne gange.
  2. Materialisering af delvise resultater til en #temp tabel kan fremtvinge en mere optimal sammenføjningsrækkefølge for den del af planen ved at fjerne nogle mulige muligheder fra ligningen.
  3. Materialisering af delvise resultater til en #temp tabel kan forbedre resten af ​​planen ved at korrigere dårlige kardinalitetsestimater.

Den mest pålidelige metode er simpelthen at bruge en #temp bord og materialiser det selv.

I modsat fald vedrørende punkt 1, se Giv et tip til at fremtvinge mellemliggende materialisering af CTE'er eller afledte tabeller . Brugen af ​​TOP(large_number) ... ORDER BY kan ofte tilskynde resultatet til at blive spoolet i stedet for gentagne gange at revurdere.

Selvom det virker, er der dog ingen statistik på spolen.

For punkt 2 og 3 skal du analysere, hvorfor du ikke fik den ønskede plan. Eventuelt omskrivning af forespørgslen til at bruge sargerbare prædikater, eller opdatering af statistik kan få en bedre plan. I modsat fald kan du prøve at bruge forespørgselstip for at få den ønskede plan.



  1. SQL NOT Operator for begyndere

  2. Java Date og MySQL tidsstempler tidszoner

  3. Er COUNT(rowid) hurtigere end COUNT(*)?

  4. Dynamisk minimumsværdi for specifikt område (mysql)