sql >> Database >  >> RDS >> Sqlserver

Voorwaardelijke filtering toepassen in WHERE-clausule

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 .



  1. De resultaten van twee afzonderlijke MySQL-query's combineren

  2. hoe mysql-subquery in yii CDbCriteria te converteren?

  3. Converteer WM_CONCAT naar Listagg

  4. Geschiedenis van SQL Server Onderhoudsplan controleren op succes of mislukking