Performances les plus rapides avec la logique DELETE NOT IN nestede

J'essaie d'get la performance la plus rapide pour cette requête DELETE (et SELECT). Existe-t-il un meilleur moyen de supprimer les loggings, car cela prend plus de 10 minutes pour s'exécuter? J'imagine qu'il doit faire son propre sorting et merge jusqu'à ce qu'il puisse find les disques.

SELECT COUNT([VISIT_ID]) FROM [dbo].[I2B2_SRC_VISITS] WHERE [PATIENT_ID] NOT IN ( SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT] ) DELETE FROM [dbo].[I2B2_SRC_VISITS] WHERE [PATIENT_ID] NOT IN ( SELECT [PATIENT_ID] FROM [dbo].[I2B2_SRC_PATIENT] ) 

EDIT: Je ne pouvais pas mettre le DELETE devant cette requête comme je l'ai fait avec le SELECT. Mais c'était le résultat final de l'instruction DELETE.

 DELETE FROM [dbo].[I2B2_SRC_VISITS] WHERE [VISIT_ID] IN ( SELECT a.[VISIT_ID] FROM [dbo].[I2B2_SRC_VISITS] a LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b ON a.[PATIENT_ID] = b.[PATIENT_ID] WHERE b.[PATIENT_ID] IS NULL ) 

que diriez-vous de le faire via JOIN ?

 DELETE a FROM [dbo].[I2B2_SRC_VISITS] a LEFT JOIN [dbo].[I2B2_SRC_PATIENT] b ON a.[PATIENT_ID] = b.[PATIENT_ID] WHERE b.[PATIENT_ID] IS NULL 

Assurez-vous que la colonne [PATIENT_ID] des deux tables contient une key qui la rend plus rapide.


Droite. NOT EXIST est meilleur.

 DELETE a FROM [dbo].[I2B2_SRC_VISITS] a WHERE NOT EXISTS ( SELECT 1 FROM [dbo].[I2B2_SRC_PATIENT] b WHERE a.[PATIENT_ID] = b.[PATIENT_ID] )