Am o tabela părinte Orders
și un Copil de masă Jobs
cu următoarele date eșantion
Vreau pentru a selecta Comenzi pe baza următoarelor cerințe
1>Pentru fiecare comanda nu poate fi 0 sau mai multe locuri de muncă. Nu selectați comanda, dacă nu aveți nici o slujbă.
2>Un utilizator nu poate lucra pe mai mult de un loc de muncă care aparține aceluiași ordin.
De exemplu Utilizatorului 1
nu pot lucra pe locuri de Muncă, care aparține Ordinul 1 și 2 pentru că el deja a lucrat la locuri de muncă 1
și 4
din același ordin.
3>selectați Doar comenzile care au locuri de muncă în Requested
starea
Am urmatoarea interogare care-mi dă rezultatul așteptat
DECLARE @UserID INT = 2
SELECT O.OrderID
FROM Orders O
JOIN Jobs J ON J.OrderID = O.OrderID
WHERE
J.JobStatus = 'Requested' AND
NOT EXISTS
(
--Must not have worked this Order
SELECT 1 FROM Jobs J1
WHERE J1.OrderID = O.OrderID AND J1.UserID = @UserID
)
Group By o.OrderID
Interogarea se alătură Jobs
tabelul de două ori. Eu sunt încercarea de a optimiza interogare și în căutarea pentru o modalitate de a atinge rezultatul scontat prin utilizarea Jobs
masa o singură dată, dacă este posibil. Orice altă soluție este, de asemenea, apreciat. Pot modifica schema de masă, dacă este necesar.
Locuri de muncă masa are aproape 20M rânduri și unele interogare în timp arată o performanță slabă. (Da, ne-am uitat la indici). Cred sale de scanare de locuri de muncă de masă de două ori cauzează problema de performanță.
ID
de tip int. Doar pentru a înțelege scopul l-am păstrat ca nvarchar