supprimer des enregistrements d'une table dont des champs sont dans un

supprimer des enregistrements d'une table dont des champs sont dans un - SQL/NoSQL - Programmation

Marsh Posté le 08-06-2014 à 18:08:35    

Bonjour j'ai deux tables T1 et T2 avec une clé primaire commune Clef
 
T1(col0, col1,clef,col2,col3,col4) et une table t2(col1,clef,col2,col3,col4,col5)
et je veux supprimer tous les enregistrements de T2 ayant (col1,col2,col3,col4) qui ont un représentant(col1,col2,col3,col4) dans T1
 
Comment peut-on y arriver sans mettre beaucoup de temps (j'ai 1.800 enregistrements dans T1 et 11.000 enregistrements dans T2)
 
Merci infiniment

Reply

Marsh Posté le 08-06-2014 à 18:08:35   

Reply

Marsh Posté le 09-06-2014 à 08:05:51    

Vu le faible nombre d'enregistrements, un simple DELETE avec un INNER JOIN devrait être assez rapide
 

Code :
  1. DELETE  table2Records
  2. FROM T2 table2Records INNER JOIN T1
  3.  ON t1.col1 = table2Records.col1 AND t1.col2 = table2Records.col2 AND t1.col3 = table2Records.col3 AND t1.col4 = table2Records.col4


 
Si jamais c'est toujours pas assez rapide, voici 2 pistes :
 
1) Créer le(s) index(es) qui vont bien sur les colonnes col1/col2/col3/col4 pour optimiser le plan d'exécution utilisé lors du INNER JOIN
 
2) Découper ta table en partitions suivant les valeurs des colonnes. Au lieu d'effectuer un DELETE, tu pourrais alors faire un TRUNCATE sur la partition qui va bien et ce sera instantané.
 
Je pense pas que tu aies besoin d'aller aussi loin que le point 2) ceci dit vu ton nombre d'enregistrements faible.

Message cité 1 fois
Message édité par Yonel le 09-06-2014 à 08:06:51
Reply

Marsh Posté le 09-06-2014 à 08:31:30    

Yonel a écrit :

Vu le faible nombre d'enregistrements, un simple DELETE avec un INNER JOIN devrait être assez rapide
 

Code :
  1. DELETE  table2Records
  2. FROM T2 table2Records INNER JOIN T1
  3.  ON t1.col1 = table2Records.col1 AND t1.col2 = table2Records.col2 AND t1.col3 = table2Records.col3 AND t1.col4 = table2Records.col4


 
Si jamais c'est toujours pas assez rapide, voici 2 pistes :
 
1) Créer le(s) index(es) qui vont bien sur les colonnes col1/col2/col3/col4 pour optimiser le plan d'exécution utilisé lors du INNER JOIN
 
2) Découper ta table en partitions suivant les valeurs des colonnes. Au lieu d'effectuer un DELETE, tu pourrais alors faire un TRUNCATE sur la partition qui va bien et ce sera instantané.
 
Je pense pas que tu aies besoin d'aller aussi loin que le point 2) ceci dit vu ton nombre d'enregistrements faible.


 
Tu utilises quoi comme DB ou SQL, Maestro1303 ?
J'ai toujours revé :D  de faire des delete comme ça mais ça n'a jamais marché. :fou:  
Mon SQL ou mon DB (je suis sur AS400), ne veut pas ...
 
Je suis à chaque fois obligé de passer par le delete classique (décrits x et x fois sur les forums, maestro, tu l'as même ici sur ce forum)...
Delete from Table1 as a where (a.c1, a.c2, ...,a.cn) in (select b.c1, b.c2....,b.cn from Table 2 as b)
 
C'est quoi, un découpage en partition?  
 
 
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 09-06-2014 à 08:38:00    

Ah bizarre, je pensais que ce genre de DELETE avec INNER JOIN était standard. En tout cas sous SQL Server ou Oracle ça pose pas de problème.
 
Le découpage en partition de ta table ça permet de découper tes données en fonction par exemple d'une colonne.
Ensuite tu peux utiliser ce genre de commandes :
 
ALTER TABLE table_name TRUNCATE PARTITION partition_name [{DROP|REUSE} STORAGE]
 
Hyper puissant puisqu'à ce moment là ta suppression de données est instantanée quel que soit ton nombre d'enregistrements. Par contre faire gaffe puisque pas de ROLLBACK possible et ça nécessite de recalculer les statistiques sur tes INDEX.


Message édité par Yonel le 09-06-2014 à 08:38:27
Reply

Marsh Posté le 09-06-2014 à 08:45:34    

Sinon tu as cette méthode qui devrait pas poser de problèmes de vitesse non plus :
 

Code :
  1. Delete from <table2>
  2. where exists ( select * from <table1> where <joining condition> )

Reply

Marsh Posté le 12-06-2014 à 01:07:06    

Merci infiniment,
 
Grace à la contribution de tous j'y suis arrivé.
 
Merci beacoup

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed