sql >> Databáze >  >> RDS >> Sqlserver

Použijte podmíněné filtrování v klauzuli WHERE

Nejprve toto ((J.Id = @Jobid and @Jobid>0) or @Jobid=0) lze nahradit
tímto (@Jobid = 0 or J.Id = @Jobid) .Všimněte si, že od 0 zjevně není platná hodnota pro ID úlohy (nebo zaměstnance nebo potenciálního zákazníka), and část je irelevantní, protože žádný záznam nikdy nebude obsahovat id 0.

Za druhé, nepoužívejte 0 jako neplatnou hodnotu použijte null namísto. nebude to mít vliv na výkon, ale je to lepší programovací zvyk, protože 0 může být velmi dobře platnou hodnotou v jiných situacích.

Za třetí, je známo, že univerzální dotazy trpí výpadky výkonu, zejména v uložených procedurách, protože plán provádění v mezipaměti nemusí být pro aktuální provádění nejvhodnější. Podle mého nejlepšího vědomí je nejlepším způsobem, jak to zvládnout, přidat k dotazu nápovědu pro rekompilaci, jak je navrženo v tento článek a v tomto článku .

Navrhuji tedy, aby váš dotaz vypadal takto:

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 výkon se obvykle zlepší správným indexováním tabulek. Správné indexování však vyžaduje znalosti, které nemají všichni vývojáři. Je to téma, které stojí za přečtení. začnu zde .



  1. použití aliasu splynout v podmínce:splynout (max (případ, kdy hodnota, potom hodnota) jako alias

  2. Vložení dat, pokud je počet řádků větší než 0, nefunguje

  3. Vztah MySQL jeden k mnoha:GROUP_CONCAT nebo JOIN nebo obojí?

  4. Node.js &MySQL - Chyba:1251 - Klient nepodporuje ověřovací protokol požadovaný serverem; zvažte upgrade klienta MySQL