En zo begint het ongelukkige spel van "proberen de optimizer te slim af te zijn (omdat deze niet altijd het beste weet)".
U kunt proberen de filtergedeelten in een subquery of CTE te plaatsen:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Wat misschien voldoende is om het eerst te laten filteren (maar de optimizer wordt "slimmer" bij elke release en kan soms door dergelijke shenanigans heen kijken). Of misschien moet u zo ver gaan dat u deze code in een UDF . Als u de UDF schrijft als een functie met tabelwaarde met meerdere instructies, met de filtering erin, en vervolgens die UDF opvraagt met uw TOP x
/ORDER BY
, je hebt de queryvolgorde vrij goed geforceerd (omdat SQL Server momenteel niet kan optimaliseren rond UDF's met meerdere instructies).
Natuurlijk, als je erover nadenkt, is het introduceren van de UDF slechts een manier om te verbergen wat we echt doen - maak een tijdelijke tabel, gebruik één query om deze in te vullen (op basis van WHERE-filters), en dan nog een query om de TOP x
uit de tijdelijke tabel.