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