Eerst deze ((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
kan worden vervangen
door deze (@Jobid = 0 or J.Id = @Jobid)
.Merk op dat sinds 0
is duidelijk geen geldige waarde voor job id (of werknemer, of lead), de and
deel is niet relevant aangezien geen enkel record ooit een id van 0 zal bevatten.
Ten tweede, gebruik geen 0
gebruik als ongeldige waarde null
in plaats van. het zal de prestaties niet beïnvloeden, maar het is een betere programmeergewoonte, aangezien 0
kan heel goed een geldige waarde zijn in andere situaties.
Ten derde is bekend dat catch-all-query's te lijden hebben van prestatieverlies, vooral in opgeslagen procedures, omdat het uitvoeringsplan in de cache mogelijk niet het beste is voor de huidige uitvoering. Voor zover ik weet, is de beste manier om hiermee om te gaan het toevoegen van een hercompileerhint aan de query, zoals gesuggereerd in dit artikel en in dat artikel .
Ik stel dus voor dat uw vraag er als volgt uitziet:
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-prestaties worden meestal verbeterd met een correcte indexering van de tabellen. Voor correct indexeren is echter kennis vereist die niet alle ontwikkelaars hebben. Het is een onderwerp dat de moeite waard is om over te lezen. Ik zou hier beginnen .