2010-12-16 363 views
2

Le débogage d'une application qui interroge SQL Server 05 ne peut pas modifier la requête mais doit optimiser les choses.TSQL NOT EXISTS Pourquoi cette requête est-elle si lente?

Exécuter toutes les sélections séparément sont rapides < 1sec, par exemple: sélectionnez * à partir d'acscard, sélectionnez id de l'employé ... Une fois réunies, cela prend 50 secondes.

Vaut-il mieux définir les champs accesscardid sans intérêt sur null ou sur '' lors de l'utilisation d'EXISTS?

SELECT * FROM ACSCard 
    WHERE NOT EXISTS 
    (SELECT Id FROM Employee 
       WHERE Employee.AccessCardId = ACSCard.acs_card_number) 
    AND NOT EXISTS 
    (SELECT Id FROM Visit 
       WHERE Visit.AccessCardId = ACSCard.acs_card_number) 
    ORDER by acs_card_id 

Répondre

3

Avez-vous des index sur Employee.AccessCardId, Visit.AccessCardId et ACSCard.acs_card_number?

+0

Cela devrait faire un commentaire sur la question originale ... Pas une réponse. –

+0

Indexes résolu le problème - ne peut pas croire qu'ils n'étaient pas là depuis le début! – Mobs

1

La clause SELECT n'est pas évaluée dans une clause EXISTS. Ce:

WHERE EXISTS(SELECT 1/0 
       FROM EMPLOYEE) 

... devrait soulever une erreur de division par zéro, mais il ne sera pas. Mais vous devez placer quelque chose dans la clause SELECT pour que ce soit une requête valide - cela n'a pas d'importance si c'est NULL ou une chaîne de longueur zéro.

Dans SQL Server, NOT EXISTS (and NOT IN) are better than the LEFT JOIN/IS NULL approach if the columns being compared are not nullable (the values on either side can not be NULL). Les colonnes comparées doivent être indexées, si ce n'est déjà fait.