そして、「オプティマイザーの裏をかこうとする (オプティマイザーが常に最善を知っているとは限らないため)」という不幸なゲームが始まります。
フィルタリング部分をサブクエリまたは 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 は現在、複数ステートメントの UDF を最適化できないためです)。
もちろん、考えてみると、UDF を導入することは、私たちが実際に行っていることを隠す方法にすぎません。一時テーブルを作成し、1 つのクエリを使用してデータを入力し (WHERE フィルターに基づいて)、次に別のクエリを使用して TOP x
一時テーブルから。