Bonjour à tous,
Je suis très limité en SQL, j'ai un peu cherché la réponse à ma question sur le net mais je l'ai pas trouvée, si tant est qu'elle existe...
Pour commencer, j'utilise Sybase, je ne pense pas que ma question soit spécifique à ce SGBD, donc je la pose ici, par contre, pour éviter que Sybase s'emmêle avec ses logs, sur les conseils de gens plus au point en SQL, avant de lancer mes suppressions je fais ça :
5000 étant une valeur arbitraire dont on m'a dit qu'elle marchait bien...
Pour en venir à la commande elle-même, j'ai un delete assez simple à faire (en fait j'ai du mal à imaginer plus simple) puisqu'il se base sur un test ne concernant qu'un seul champ (et en plus ce champ est de type INT).
Disons que la ligne suivante fait exactement ce que je veux :
delete table where champàtester = valeur
Le problème c'est qu'elle met énormément de temps.
En fait je fais plusieurs delete dans des tables différentes la plus grosse fait un peu moins de 250 000 000 lignes mais celle qui me pose le plus de problème en fait environ 10 fois moins, dans le cas de cette table particulière le champàtester est une des trois clefs d'un index, on m'a conseillé une petite feinte : faire apparaitre les deux autres champs dans ma requête (en testant qu'ils étaient égaux à eux même pour ne pas modifier le résultat final) :
delete table where champàtester = valeur and autrechampdelindex1 = autrechampdelindex1 and autrechampdelindex2 = autrechampdelindex2
mais c'est à la fois moche (ça à la limite je peux faire avec) et visiblement pas efficace (même si j'ai fait mes tests empiriquement et sans les compétences nécessaires pour vraiment maîtriser les aléas comme la gestion des caches par Sybase et les autres personnes pouvant accéder à la base en même temps). Au passage l'index (et oui, j'ai encore le fol espoir qu'il puisse me servir à quelque chose) est de type "clustered, unique".
Pour info une suppression "moyenne" concerne environ 10% des données, c'est vraiment à la louche mais c'est pour dire que, a priori, la solution de contournement consistant à sélectionner les lignes à ne pas effacer pour les mettre dans une table temporaire, puis à effacer la table courante et à renommer la table temporaire ne devrait pas être très efficace.
ps : je peux peut être demander la création d'un index (ou autre, je veux dire une modification de la base autre que les données) mais je ne suis pas sûr que ça aboutisse et il me faudrait de solides arguments, dans le même ordre d'idée je peux faire quelques tests mais je peux pas occuper la base toute la journée (et à chaque fois c'est très long).
pps : sans être ultra sensibles mes données sont confidentielles, c'est pour ça que je n'ai pas trop donné de détails même si je pense qu'on voit assez bien le problème, si toutefois vous avez des questions spécifiques...
Voilà, désolé pour la longueur de ce post (qui aurait sans doute tenu en quelques lignes si j'avais su quelles informations étaient vraiment pertinentes), en tout cas si quelqu'un a une idée ça me serait bien utile...
Partager