sql >> Database >  >> RDS >> Sqlserver

Hoe kan ik een subquery dwingen om even goed te presteren als een #temp-tabel?

Er zijn een paar mogelijke verklaringen waarom u dit gedrag ziet. Enkele veelvoorkomende zijn

  1. De subquery of CTE wordt mogelijk herhaaldelijk opnieuw geëvalueerd.
  2. Gedeeltelijke resultaten materialiseren in een #temp tabel kan een meer optimale samenvoegvolgorde voor dat deel van het plan afdwingen door enkele mogelijke opties uit de vergelijking te verwijderen.
  3. Gedeeltelijke resultaten materialiseren in een #temp tabel kan de rest van het plan verbeteren door slechte kardinaliteitsschattingen te corrigeren.

De meest betrouwbare methode is om gewoon een #temp . te gebruiken tafel en materialiseer het zelf.

Bij gebrek aan dat met betrekking tot punt 1 zie Geef een hint om tussentijdse materialisatie van CTE's of afgeleide tabellen te forceren . Het gebruik van TOP(large_number) ... ORDER BY kan vaak aanmoedigen om het resultaat in de wachtrij te plaatsen in plaats van herhaaldelijk opnieuw te evalueren.

Zelfs als dat werkt, zijn er geen statistieken over de spoel.

Voor de punten 2 en 3 zou je moeten analyseren waarom je niet het gewenste plan kreeg. Mogelijk herschrijven van de query om sargable predikaten te gebruiken, of het bijwerken van statistieken kan een beter plan krijgen. Als dat niet lukt, kun je proberen om zoekopdrachthints te gebruiken om het gewenste plan te krijgen.



  1. Grafiekproblemen:verbinding maken via NOCYCLE voorafgaande vervanging in SQL-server?

  2. JPA RollbackException maar niet in eenheidstest

  3. Oracle:hoe voeg ik minuten toe aan een tijdstempel?

  4. Hoe kan ik een verzameling gebruiken binnen een Oracle SQL-instructie?