Първо, този ((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
може да се замени
с този (@Jobid = 0 or J.Id = @Jobid)
.Обърнете внимание, че от 0
очевидно не е валидна стойност за идентификатор на работа (или служител, или водещ), and
част е без значение, тъй като нито един запис никога няма да съдържа id от 0.
Второ, не използвайте 0
като невалидна стойност използвайте null
вместо. това няма да повлияе на производителността, но е по-добър навик за програмиране, тъй като 0
може много добре да бъде валидна стойност в други ситуации.
Трето, известно е, че catch-all заявките страдат от влошаване на производителността, особено в съхранените процедури, тъй като кешираният план за изпълнение може да не е най-добрият за текущото изпълнение. Доколкото ми е известно, най-добрият начин да се справите с това е да добавите намек за повторно компилиране към заявката, както е предложено в тази статия и в тази статия .
И така, предлагам вашата заявка да изглежда така:
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 производителността обикновено се подобрява с правилно индексиране на таблиците. Правилното индексиране обаче изисква знания, които не всички разработчици имат. Това е тема, която си струва да се прочете. Бих започнал тук .