Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wenden Sie die bedingte Filterung in der WHERE-Klausel an

Zuerst dieser ((J.Id = @Jobid and @Jobid>0) or @Jobid=0) kann
mit diesem (@Jobid = 0 or J.Id = @Jobid) ersetzt werden .Beachten Sie, dass seit 0 ist offensichtlich kein gültiger Wert für Job-ID (oder Mitarbeiter oder Lead), and Teil ist irrelevant, da kein Datensatz jemals eine ID von 0 enthalten wird.

Zweitens:Verwenden Sie nicht 0 Verwenden Sie als ungültigen Wert null stattdessen. es wird sich nicht auf die Leistung auswirken, aber es ist eine bessere Programmiergewohnheit seit 0 könnte in anderen Situationen durchaus ein gültiger Wert sein.

Drittens ist bekannt, dass Catch-all-Abfragen Leistungseinbußen erleiden, insbesondere in gespeicherten Prozeduren, da der zwischengespeicherte Ausführungsplan möglicherweise nicht der beste für die aktuelle Ausführung ist. Nach meinem besten Wissen besteht die beste Möglichkeit, dies zu handhaben, darin, der Abfrage einen Neukompilierungshinweis hinzuzufügen, wie in dieser Artikel und in diesem Artikel .

Daher schlage ich vor, dass Ihre Abfrage so aussieht:

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-Performance wird in der Regel durch korrekte Indizierung der Tabellen verbessert. Die korrekte Indizierung erfordert jedoch Kenntnisse, die nicht alle Entwickler haben. Es ist ein lesenswertes Thema. Ich würde hier beginnen .