A tak začíná nešťastná hra „snažit se přelstít optimalizátora (protože ne vždy ví nejlépe)“.
Můžete zkusit vložit filtrované části do poddotazu nebo CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Což může stačit k tomu, aby se nejprve přinutil filtrovat (ale optimalizátor je s každým vydáním „chytřejší“ a někdy dokáže prokouknout takovéto podvody). Nebo možná budete muset jít tak daleko, že vložíte tento kód do UDF . Pokud zapíšete UDF jako vícepříkazovou tabulkovou funkci s filtrováním uvnitř a poté se na UDF dotazujete pomocí TOP x
/ORDER BY
, docela dobře jste si vynutili pořadí dotazování (protože SQL Server aktuálně není schopen optimalizovat kolem vícepříkazových UDF).
Samozřejmě, když o tom přemýšlíme, zavedení UDF je jen způsob, jak skrýt to, co skutečně děláme - vytvořit dočasnou tabulku, použít jeden dotaz k jejímu naplnění (na základě filtrů WHERE), pak další dotaz k nalezení