sql >> データベース >  >> RDS >> Sqlserver

ORDER BY に関係なく、SELECT TOP は遅い

    そして、「オプティマイザーの裏をかこうとする (オプティマイザーが常に最善を知っているとは限らないため)」という不幸なゲームが始まります。

    フィルタリング部分をサブクエリまたは 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 一時テーブルから。




    1. SQL Server DataTypesと同等のC#

    2. Oracleテーブルの行を列に変換する方法

    3. 1か月で21歳になるすべての従業員を取得するにはどうすればよいですか?

    4. OracleクライアントなしのPythonOracleDB Connect