Nejprve toto ((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
lze nahradit
tímto (@Jobid = 0 or J.Id = @Jobid)
.Všimněte si, že od 0
zjevně není platná hodnota pro ID úlohy (nebo zaměstnance nebo potenciálního zákazníka), and
část je irelevantní, protože žádný záznam nikdy nebude obsahovat id 0.
Za druhé, nepoužívejte 0
jako neplatnou hodnotu použijte null
namísto. nebude to mít vliv na výkon, ale je to lepší programovací zvyk, protože 0
může být velmi dobře platnou hodnotou v jiných situacích.
Za třetí, je známo, že univerzální dotazy trpí výpadky výkonu, zejména v uložených procedurách, protože plán provádění v mezipaměti nemusí být pro aktuální provádění nejvhodnější. Podle mého nejlepšího vědomí je nejlepším způsobem, jak to zvládnout, přidat k dotazu nápovědu pro rekompilaci, jak je navrženo v tento článek a v tomto článku .
Navrhuji tedy, aby váš dotaz vypadal takto:
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
select výkon se obvykle zlepší správným indexováním tabulek. Správné indexování však vyžaduje znalosti, které nemají všichni vývojáři. Je to téma, které stojí za přečtení. začnu zde .