J'essaie d'obtenir les performances les plus rapides pour cette requête DELETE (et SELECT). Existe-t-il un meilleur moyen de supprimer les enregistrements, car cela prend plus de 10 minutes pour s'exécuter? J'imagine qu'il doit faire son propre tri et fusionner jusqu'à ce qu'il puisse trouver les disques.Performances les plus rapides avec la logique DELETE Requête imbriquée
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 SUPPRIMER 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
)
[ExplainExtended] (http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/) [ BlogSQLAuthority] (http://blog.sqlauthority.com/2008/04/22/sql-server-better-performance-left-join-or-not-in/) et bien d'autres documents en ligne vous orienteront vers NOT IN/PAS EXISTE comme vous l'avez déjà écrit. Cependant, il y a toujours des exceptions, comme lorsque vous n'avez pas les index nécessaires (qui peuvent parfois être valides). Essayez toujours autant de formulaires que vous connaissez et utilisez ce qui fonctionne bien. Cependant, pour de petits ensembles de données, cela n'a probablement pas d'importance. – RichardTheKiwi