Maka dimulailah permainan "mencoba mengakali pengoptimal (karena tidak selalu yang terbaik)".
Anda dapat mencoba memasukkan bagian pemfilteran ke dalam subkueri atau CTE:
SELECT TOP 30 *
FROM
(SELECT *
FROM myview, foo, bar
WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;
Yang mungkin cukup untuk memaksanya memfilter terlebih dahulu (tetapi pengoptimal menjadi "lebih pintar" dengan setiap rilis, dan terkadang dapat melihat melalui kejahatan semacam itu). Atau Anda mungkin harus memasukkan kode ini ke dalam UDF . Jika Anda menulis UDF sebagai fungsi bernilai tabel multipernyataan, dengan pemfilteran di dalamnya, lalu kueri UDF tersebut dengan TOP x
Anda /ORDER BY
, Anda telah memaksakan urutan kueri dengan cukup baik (karena SQL Server saat ini tidak dapat mengoptimalkan UDF multi-pernyataan).
Tentu saja, memikirkannya, memperkenalkan UDF hanyalah cara menyembunyikan apa yang sebenarnya kami lakukan - buat tabel temp, gunakan satu kueri untuk mengisinya (berdasarkan filter WHERE), lalu kueri lain untuk menemukan TOP x
dari tabel temp.