2013-04-19 4 views
4

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 
) 
+0

[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

Répondre

3

pourquoi ne pas 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 est essentiel de définir sur eux ce qui le rend plus rapide.


Droite. NOT EXIST est le 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] 
     ) 
+0

Pouvez-vous expliquer pourquoi ce serait plus rapide que NOT IN? Je m'attendrais à une alternative NOT EXISTS, qui est constamment prouvée comme l'option la plus efficace, et/ou des suggestions autour des index appropriés (sans lesquels aucune solution ne sera rapide). –

+0

WOW, TOUT LE TEMPS! 21 SECONDES! JE VOUS REMERCIE! – MacGyver

+0

FYI, je n'ai pas d'index sur cette table, mais peut-être que je pourrais tester avec un index plus tard – MacGyver

Questions connexes