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

Oracle Discussion :

Blocage sur un DELETE FROM table CASCADE;


Sujet :

Oracle

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut Blocage sur un DELETE FROM table CASCADE;
    Bonjour,

    J'ai une DB avec plusieurs tables et des relations entre elles avec des FK.

    Je veux vider toute la DB en effaçant les contenu de toutes les tables sans faire de DROP TABLE.

    Je commence à effacer toutes les tables enfants, et je termine par les parents (ceux qui sont référencés par les FK des enfants). En faite j'efface à l'ordre inverse du remplissage de la DB.

    J'arrive à effacer la plupart des tables en faisant
    DELETE FROM table CASCADE;

    Sauf que 3 tables résistent et ne veulent pas s'effacer. Toutes les 3 sont est référencée par FK par 2 tables respectivement qui sont déjà vides.
    La commande DELETE s’exécute sans fin, j'ai même laissé tourner la nuit, le lendemain le DELETE n'a toujours pas fini d'effacer la table.

    Je ne comprends pas: pour quelle raison je n'arrive pas à effacer ces tables qui sont référencées par des FK des tables vides. D'autres tables se sont effacées sans problème et d'autres bloquent. Parmi les tables effacées figure même une table référencée par 5 autres tables.

    Le seul moyen que j'ai trouvé de les effacer c'est de faire un ALTER TABLE table DISABLE CONSTRAINT et ensuite effacer, mais je n'ai toujours pas compris pourquoi il y a eu un tel blocage.

    Il faut dire aussi qu'en environnement de DEV j'ai le droit de faire ALTER TABLE, mais en prod je ne les aurais pas, donc j'aimerais bien comprendre ce qui se passe.

    Quelqu'un a une idée?

  2. #2
    Membre confirmé
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Par défaut
    As-tu des FK récursives (ex : fils qui référence le père dans la même table) ?
    Des triggers on delete ?

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il manque probablement des index sur les clefs étrangères, très impactant notamment pour les DELETE CASCADE.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    N'auriez-vous pas oublié de valider la transaction dans laquelle vous avez vidé les tables référençantes ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Il n'y a pas d'index sur les FK. Par contre j'ai essayé avec et sans CASCADE, ça ne change rien.
    Il n'y a pas de FK récursives.

    Les tables qui ne s'effacent pas sont les 3 dernières de la liste des DELETE.

    Et ce sont les 3 premières tables par lesquelles on commence les INSERT en DB

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    N'auriez-vous pas oublié de valider la transaction dans laquelle vous avez vidé les tables référençantes ?
    Non, j'ai tout essayé, j'ai fait un COMMIT, j'ai même tué les autres connexions - rien à faire.

  7. #7
    Membre confirmé
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Janvier 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 28
    Par défaut
    Le tablespace d'undo est assez grand ?

  8. #8
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par cmako Voir le message
    ...
    DELETE FROM table CASCADE;
    ...
    Comprenez-vous que cascade est juste un alias de la table <table>

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bien vu mnitu, j'étais passé à côté !

  10. #10
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Comprenez-vous que cascade est juste un alias de la table <table>
    Bien vu
    Alors il faudrait voir si ça va plus vite avec
    delete from test fast;


    Il n'y a pas d'index sur les FK
    Alors pour chaque enregistrement de la table mère, il faut faire un full table scan de la table fille pour vérifier. Et un full scan sur une table qui a eu beaucoup de données (même si il n'y en a plus) est coûteux.

  11. #11
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par pachot Voir le message
    Alors pour chaque enregistrement de la table mère, il faut faire un full table scan de la table fille pour vérifier. Et un full scan sur une table qui a eu beaucoup de données (même si il n'y en a plus) est coûteux.
    Mais pourquoi fait-il un full tablescan? Les FK de la table mère référencent les PK des tables filles. Il y a donc bien un index unique, qui doit être à jour et donc le moteur DB doit parcourir celui-ci et non pas la table complète !?

    Sinon, y a-t-il une solution pour éliminer le problème?

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par cmako Voir le message
    Sinon, y a-t-il une solution pour éliminer le problème?
    Oui en créant un index sur les FK.

    Sinon une meilleur méthode (à mon sens) serait de disable les FK, truncate les tables (réinitialise le High Water Mark) puis ré-enable les FK.

  13. #13
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par cmako Voir le message
    Les FK de la table mère référencent les PK des tables filles.
    Pour moi, j'appelle table mère celle qui est référence. Donc la suppression dans la table mère doit vérifier qu'il n'y a pas de lignes qui deviendraient orphelines dans la table fille.
    Cordialement,
    Franck.

  14. #14
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,

    Pour moi, j'appelle table mère celle qui est référence. Donc la suppression dans la table mère doit vérifier qu'il n'y a pas de lignes qui deviendraient orphelines dans la table fille.
    Cordialement,
    Franck.
    Je ne comprends pas trop la réponse. Je comprends que ça doit vérifier les tables filles. Mais, les tables filles sont toutes vides !!!
    J'ai aussi remarqué que c'est une seule table qui bloque toutes les autres.
    Les 4 tables en question ont, entre autres, une même table fille qui bloque le DELETE.
    Lorsque je désactive les FK de cette table, les tables mères s'effacent. Mais les tables mères ont d'autres filles qui pourtant ne posent pas de problèmes.

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Vérifiez l'indexation des FK de cette table fille.

    Votre table est vide mais les blocs sont toujours présents puisque vous avez fait des delete, donc si les FK ne sont pas indexées Oracle doit full scan la table composée de nombreux bloc vide (c'est le concept de High Water Mark)

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Vérifiez l'indexation des FK de cette table fille.

    Votre table est vide mais les blocs sont toujours présents puisque vous avez fait des delete, donc si les FK ne sont pas indexées Oracle doit full scan la table composée de nombreux bloc vide (c'est le concept de High Water Mark)
    Est-ce qu'il est possible de réduire le Water Mark sans créer d’index?
    Si oui, comment?

    Merci.

  17. #17
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par cmako Voir le message
    Est-ce qu'il est possible de réduire le Water Mark sans créer d’index?
    Aucun lien entre le High Water Mark et l'index. Vous devez comprendre que si vous avez des foreign keys et vous supprimez dans la table parent vous devez créer un index.
    Sinon sur votre question on vous a déjà répondu:
    ...truncate les tables (réinitialise le High Water Mark)...

  18. #18
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Sinon sur votre question on vous a déjà répondu:
    ...truncate les tables (réinitialise le High Water Mark)...
    Si on a des foreign keys on ne peut pas faire de TRUNCATE TABLE. On aura une erreur ORA-02266.
    De plus je n'aurais pas les droits nécessaires pour faire un TRUNCATE.

  19. #19
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par cmako Voir le message
    Si on a des foreign keys on ne peut pas faire de TRUNCATE TABLE. On aura une erreur ORA-02266.
    De plus je n'aurais pas les droits nécessaires pour faire un TRUNCATE.
    J'avais pensé que vous aller lire tout le paragraphe:
    ...serait de disable les FK, truncate les tables (réinitialise le High Water Mark) puis ré-enable les FK
    Si vous ne pouvez pas faire truncate ne le faite pas. Je vous ai répondu à votre question
    Est-ce qu'il est possible de réduire le Water Mark sans créer d’index?
    et non pas donné des conseils sur votre traitement.

  20. #20
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Merci pour vos réponses.

    Finallement, j'ai contourné le problème en créant la procédure sur le schéma dont je ne suis pas propriétaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE PROCEDURE SP_RESIZE (tablename VARCHAR2) AS
    BEGIN
      EXECUTE IMMEDIATE 'ALTER TABLE ' || tablename || ' ENABLE ROW MOVEMENT';
      EXECUTE IMMEDIATE 'ALTER TABLE ' || tablename || ' SHRINK SPACE';
    END;

Discussions similaires

  1. could not delete from specified table
    Par kurtalis dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 14/05/2019, 11h40
  2. DELETE FROM (toutes les tables)
    Par ®om dans le forum DB2
    Réponses: 5
    Dernier message: 22/08/2008, 08h49
  3. Delete from table
    Par Maher2010 dans le forum Débuter
    Réponses: 1
    Dernier message: 26/06/2008, 11h44
  4. Delete mutli-table sur toutes les tables d'une database
    Par Aurélie38 dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2008, 16h03
  5. Différences entre delete table et delete from table
    Par pegase06 dans le forum Administration
    Réponses: 3
    Dernier message: 16/02/2007, 15h25

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