И така започва злополучната игра на „опит за надхитряне на оптимизатора (защото той не винаги знае най-добре)“.
Можете да опитате да поставите филтриращите части в подзаявка или CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Което може да е достатъчно, за да го принуди първо да филтрира (но оптимизаторът става „по-умен“ с всяко издание и понякога може да прозре подобни шенаниги). Или може да се наложи да поставите този код в UDF . Ако напишете UDF като функция с таблична стойност с множество изрази, с филтрирането вътре, и след това направите заявка за този UDF с вашия TOP x
/ORDER BY
, доста добре сте наложили реда на заявките (тъй като SQL Server в момента не може да оптимизира около UDFs с множество изрази).
Разбира се, мислейки за това, въвеждането на UDF е просто начин да скрием това, което наистина правим - създаване на временна таблица, използване на една заявка, за да я попълните (на базата на WHERE филтри), след това друга заявка, за да намерите TOP x
от временната таблица.