Og så starter det uheldige spil med "at prøve at overliste optimizeren (fordi den ikke altid ved bedst)".
Du kan prøve at sætte filtreringsdelene ind i en underforespørgsel eller CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Hvilket kan være nok til at tvinge den til at filtrere først (men optimizeren bliver "smartere" for hver udgivelse, og kan nogle gange gennemskue sådanne skænderier). Eller du skal måske gå så langt som at sætte denne kode ind i en UDF . Hvis du skriver UDF'en som en funktion med flere sætninger med tabelværdi, med filtreringen indeni, og derefter forespørger den UDF med din TOP x
/BEstil efter
, du har ret godt gennemtvunget forespørgselsrækkefølgen (fordi SQL Server i øjeblikket ikke er i stand til at optimere omkring multistatement UDF'er).
Når man tænker over det, er introduktionen af UDF selvfølgelig kun en måde at skjule, hvad vi virkelig laver - opret en midlertidig tabel, brug en forespørgsel til at udfylde den (baseret på WHERE-filtre), derefter en anden forespørgsel for at finde