J'ai une table parent Orders
et une table d'Enfant Jobs
avec les données d'exemple suivantes
Je veux sélectionner des Commandes basées sur les conditions suivantes
1>Pour chaque commande, il peut y avoir 0 ou plusieurs emplois. Ne sélectionnez pas la commande si elle n'a pas de travail.
2>Un utilisateur ne peut pas travailler sur plus d'un travail qui appartient à la même commande.
Par exemple l'Utilisateur 1
ne peut pas travailler sur les Emplois qui appartient à l'Ordre 1 et 2 parce qu'il a déjà travaillé sur la création d'emplois 1
et 4
de la même commande.
3>sélectionner Uniquement les commandes qui ont des emplois dans Requested
statut
J'ai la requête suivante qui me donne le résultat attendu
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
Requête rejoint le Jobs
table deux fois. Je suis en train d'optimiser la requête et à la recherche d'un moyen pour atteindre le résultat visé par l'aide de Jobs
le tableau qu'une seule fois si possible. Toute autre solution est également apprécié. Je peux modifier le schéma de la table si nécessaire.
Les travaux de la table a près de 20M de lignes et de certains temps de requête affiche des performances médiocres. (Oui, nous avons regardé les index). Je pense que ses travaux de numérisation de la table deux fois l'origine du problème de performances.
ID
de type int. Juste pour but compréhension je l'ai gardé comme nvarchar