IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Script de suppression massive des données d'une table X en se basant sur une autre table Y


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut Script de suppression massive des données d'une table X en se basant sur une autre table Y
    Bonjour,

    Mon problème fonctionnel est le suivant :

    1- J'ai une table origine avec les champs uniques comme suit : date et séquence

    2- J'ai une autre table nommé tiers avec les champs uniques aussi : date et séquence.

    l'idée est de créer un script qui s'exécute périodiquement en parcourant la table tiers, s'il trouve les champs uniques date et séquence dans la table origine , il supprime l'enregistrement de cette dernière table (origine).

    Je ne sais pas comment faire ce script pl/sql ou procédure etc ... et surtout d'une façon propre et optimisé vu que les tables contiennent des données volumineuses, si vous avez une idée svp ?

    En attente de votre Feedback.

    Merci d'avance.
    Demain n'est plus à attendre mais à inventer !!!

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    As-tu besoin de quelque chose de plus compliqué que ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE
    FROM    origine ori
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    tiers   tir
                WHERE   tir.sequence    = ori.sequence
                    AND tir.date        = ori.date
            )
    ;
    De plus, si l'unicité des couples (sequence, date) est définie sur chacune de tes tables, cette contrainte est adossée à un index qui optimisera indubitablement la jointure.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Merci infiniment.

    Oui j'ai déjà crée les deux index dans les deux tables.
    Demain n'est plus à attendre mais à inventer !!!

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    As-tu besoin de quelque chose de plus compliqué que ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELETE
    FROM    origine ori
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    tiers   tir
                WHERE   tir.sequence    = ori.sequence
                    AND tir.date        = ori.date
            )
    ;
    De plus, si l'unicité des couples (sequence, date) est définie sur chacune de tes tables, cette contrainte est adossée à un index qui optimisera indubitablement la jointure.
    Merci , stp côté performance qu'est ce que tu me suggère d'utiliser ta solution ou bien la suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE FROM origine WHERE (date, sequence) IN
    (
    SELECT date,sequence FROM tiers.
    );
    Demain n'est plus à attendre mais à inventer !!!

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez comparer les plans d'exécution mais je ne pense pas que l'écart soit perceptible.

    La clef pour accélérer vos suppressions c'est de n'avoir aucun index sur la table origine hormis la clef unique (sequence, date).

    De mon expérience, c'est généralement plus rapide de supprimer ces index, de passer la suppression puis de les recréer.

  6. #6
    Membre actif Avatar de Ahmed AANGOUR
    Homme Profil pro
    DBA Oracle
    Inscrit en
    Janvier 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle

    Informations forums :
    Inscription : Janvier 2010
    Messages : 139
    Points : 271
    Points
    271
    Par défaut
    Il est révolu le temps où il y'avait une différence de plan entre le IN et EXISTS.
    Depuis la 9i le CBO lors de la phase d'optimisation de la requête transforme la requête en "unnestant" la sous requête. On obtient donc le même plan à chaque fois (sauf si vous êtes en 8i ou que vous avez désactivé la fonctionnalité QUERY TRANSFORMATION). Il juste faut s'assurer que les accès aux 2 tables se fasse de manière optimisé notamment en créant les index adaptés.
    http://ahmedaangour.blogspot.fr/2011...vs-exists.html

    Concernant les perfs des DELETES en général il faut bien avoir à l'esprit que l'instruction DELETE est surement dans oracle l'instruction la plus couteuse.
    En effet lors d'un DELETE, Oracle doit effectuer les opérations suivantes:
    - Trouver la ou les lignes à supprimer (comme pour un SELECT)
    - supprimer la ou les lignes du bloc
    - trouver et supprimer dans les blocs feuilles de l'index les entrées d'index correspondantes
    - Vérifier les contraintes d'integrité et supprimer les lignes enfants si la contrainte est en mode DELETE CASCADE
    - Executer le code des triggers ON DELETE éventuels
    - et bien sûr tout ceci genère du REDO et de l'UNDO

    Si on supprime une grosse partie de la table alors la meilleure solution serait de sauvegarder les lignes à conserver dans une table tempo, de truncater la table et de réinsérer les lignes sauvegardées.
    Bien sûr cela n'est possible que si la table n'est pas accédée pendant ce temps par d'autres sessions.

Discussions similaires

  1. [XL-2007] Récupérer des données d'un site WEB et les collées sur une feuille Excel
    Par clem4491 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 30/06/2014, 12h19
  2. [EJB] EJB sur une PC et l'application web sur un autre
    Par hichaminfo dans le forum Java EE
    Réponses: 1
    Dernier message: 24/04/2007, 16h16
  3. script SQL qui réinsère des Données d'une BD dans une autre BD.
    Par kamaldev dans le forum Administration
    Réponses: 1
    Dernier message: 19/04/2007, 14h01
  4. [MySQL] Suppression automatique des données
    Par Angelik dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 14/12/2006, 22h06
  5. [GML] Scripts shell pour extraire des données d'Oracle
    Par diamonds dans le forum XQUERY/SGBD
    Réponses: 1
    Dernier message: 28/09/2006, 07h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo