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

WHERE 句で条件付きフィルタリングを適用する

    まず、この ((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
    この (@Jobid = 0 or J.Id = @Jobid) に置き換えることができます . 注意:0 以降 明らかに、ジョブ ID (または従業員、またはリード) の有効な値ではありません。and 0 の ID を含むレコードはないため、この部分は無関係です。

    次に、0 を使用しないでください 無効な値として、null を使用します 代わりは。パフォーマンスには影響しませんが、 0 であるため、より良いプログラミング習慣になります。 他の状況では有効な値である可能性があります。

    第 3 に、キャッシュされた実行プランが現在の実行に最適ではない可能性があるため、キャッチオール クエリは、特にストアド プロシージャでパフォーマンスに影響を与えることが知られています。私の知る限り、これを処理する最善の方法は、この記事 その記事 .

    したがって、クエリは次のようにすることをお勧めします:

    CREATE PROCEDURE <procedure name>
    (
            @Jobid      INT=NULL,
            @leadid     INT=NULL,
            @employeeid INT=NULL
    )
    AS
    
    SELECT e.id,
           l.id,
           j.id,
           e.NAME,
           l.NAME,
           j.NAME
    FROM   employee e
           INNER JOIN leads l
                   ON e.leadid = l.id
           INNER JOIN Jobs j
                   ON j.id = e.Jobid 
    WHERE (@Jobid IS NULL OR J.Id = @Jobid)
    AND (@leadid IS NULL OR l.Id = @leadid)
    AND (@employeeid IS NULL OR e.Id = @employeeid)
    OPTION(RECOMPILE)
    
    GO
    

    選択のパフォーマンスは通常、テーブルの正しいインデックス付けによって改善されます。ただし、正しくインデックスを作成するには、すべての開発者が持っているわけではない知識が必要です。十分に読む価値のある題材です。 ここから始める .



    1. Rails:MySQLからPostGresに変換すると、Geokitの距離計算が壊れますか?

    2. dpkg:パッケージmysql-serverの処理中にエラーが発生しました(依存関係の問題)?

    3. Rails MySQLアダプタをインストールするにはどうすればよいですか?

    4. 前回のログイン時間を更新する方法がわからないようです