Primeiro, este
((J.Id = @Jobid and @Jobid>0) or @Jobid=0)
pode ser substituídopor 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 .