Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Aplicar filtragem condicional na cláusula WHERE


Primeiro, este ((J.Id = @Jobid and @Jobid>0) or @Jobid=0) pode ser substituído
por este (@Jobid = 0 or J.Id = @Jobid) .Observe que desde 0 obviamente não é um valor válido para ID do cargo (ou funcionário ou lead), o and parte é irrelevante, pois nenhum registro conterá um id de 0.

Segundo, não use 0 como um valor inválido, use null em vez de. não afetará o desempenho, mas é um hábito de programação melhor, pois 0 pode muito bem ser um valor válido em outras situações.

Terceiro, sabe-se que as consultas catch-all sofrem impacto no desempenho, especialmente em procedimentos armazenados, pois o plano de execução em cache pode não ser o melhor para a execução atual. Até onde sei, a melhor maneira de lidar com isso é adicionar uma dica de recompilação à consulta, conforme sugerido em este artigo e em nesse artigo .

Então, sugiro que sua consulta fique assim:
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

o desempenho de seleção geralmente é aprimorado com a indexação correta das tabelas. No entanto, a indexação correta requer conhecimento que nem todos os desenvolvedores possuem. É um assunto que vale a pena ler. Eu começaria aqui .