I tak zaczyna się niefortunna gra o „próbę przechytrzenia optymalizatora (ponieważ nie zawsze wie najlepiej)”.
Możesz spróbować umieścić fragmenty filtrujące w podzapytaniu lub CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Co może wystarczyć, aby najpierw zmusić go do filtrowania (ale optymalizator staje się „mądrzejszy” z każdym wydaniem i czasami potrafi przejrzeć takie sztuczki). Być może będziesz musiał posunąć się nawet do umieszczenia tego kodu w UDF . Jeśli napiszesz UDF jako wielowyrazową funkcję z wartościami przechowywanymi w tabeli, z filtrowaniem w środku, a następnie zapytasz ten UDF za pomocą TOP x
/ORDER BY
, całkiem dobrze wymusiłeś kolejność zapytań (ponieważ SQL Server nie jest obecnie w stanie zoptymalizować wielostanowiskowych UDF).
Oczywiście, myśląc o tym, wprowadzenie UDF to tylko sposób na ukrycie tego, co tak naprawdę robimy - utworzenie tabeli tymczasowej, użycie jednego zapytania do jej wypełnienia (na podstawie filtrów WHERE), a następnie innego zapytania, aby znaleźć TOP x
z tabeli tymczasowej.