Er zijn een paar mogelijke verklaringen waarom u dit gedrag ziet. Enkele veelvoorkomende zijn
- De subquery of CTE wordt mogelijk herhaaldelijk opnieuw geëvalueerd.
- 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. - 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.