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

SQL Oracle Discussion :

Merge into DELETE


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut Merge into DELETE
    Bonjour à tous,

    Je ne comprend pas trop pourquoi Orcale me ressort une erreur dans ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    MERGE INTO INF_CMD B
    USING W_CMD S
    ON 		(S.INTERN_NUM = B.INTERN_NUM
           AND S.ETS    = B.ETS
           )
    WHEN MATCHED THEN 
    DELETE  
    WHERE (B.REMFIN_COD = 'I')
    ;

    Est-ce que vous avez une idée?

  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
    Quel message d'erreur ?
    Avec quelle version d'Oracle ?

    Est-ce là toute la requête ?
    Sinon pourquoi ne pas exécuter celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    delete from INF_CMD B
    where   B.REMFIN_COD = 'I'
        and exists
            (   select  null
                from    USING W_CMD S
                where   S.INTERN_NUM = B.INTERN_NUM
                    and S.ETS        = B.ETS
           )
    ;
    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
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est mieux de mettre le message d'erreur.
    Il est nécessaire de préciser l'UPDATE pour réaliser le DELETE.
    Une simple recherche google vous donne les précisons nécessaires :
    MERGE
    DELETE in the MERGE statement

    Mais si vous souhaitez juste faire un DELETE, ben codez simplement un DELETE (WHERE EXISTS), pas besoin de MERGE.

  4. #4
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Merci pour vos réponses!
    Effectivement j'avais essayé avec l'update, mais je trouvais ça tellement bizarre de faire un update avant le delete..



    Et le problème est que le delete est très très lent, (1h30)
    et j'ai remarqué que parfois le merge était beaucoup plus rapide.

    La table contient 8 millions de lignes et 22 index et faire un DELETE comme ça dessus c'est pas très beau, ni performant.
    Donc j'essaye de trouver une solution


    J'ai bien entendu regardé si il y avait un INDEX sur REMFIN_COD, INTERN_NUM, ETS (dans les 2 tables) et c'est bien le cas.


    Est-ce que vous avez des idées/solution pour ce genre de cas de DELETE sur des grosses tables avec plein (trop) d'index?
    (Je peux créer un nouveau sujet si jamais)

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

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    MERGE peut être plus rapide pour l'UPDATE dans les cas où il y a une sous-requête pour le SET et une pour le test d'existance.
    Pour le DELETE, je ne vois pas trop pourquoi il y aurait un gain.

    Combien de lignes sont à supprimer, et quel est le DDL de l'index sur REMFIN_COD, INTERN_NUM, ETS ?

    Une approche possible est de DISABLE les index non utiles pour la requête et de les REBUILD après le DELETE.

  6. #6
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Merci pour votre aide.

    Donc j'ai changé les flux vendredi dernier et effectivement ça marche déjà mieux sans index!
    Bon après j'ai un eu lock plus tard après le delete! Mais ça c'est une autres histoire surement dû à la suppression des index.

    Question bête : il vaut mieux disable/rebuild ou DROP/CREATE les index? (sous oracle 11g)

  7. #7
    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
    Il n'y a pas de raison logique que le delete soit plus lent que le merge, dans les deux cas il y a autant d'index à mettre à jour.

    Il faut comparer les plans d'exécution afin de comprendre les lenteurs de la suppression.
    Mon petit doigt me dit que vous faites la suppression sans parallélisme avec mise à jour des index au fil de l'eau versus un merge en parallèle avec mise à jour des index à la fin du traitement.

  8. #8
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Pouvez-vous détailler un peu plus cette phrase stp :
    "Vous faites la suppression sans parallélisme avec mise à jour des index au fil de l'eau versus un merge en parallèle avec mise à jour des index à la fin du traitement."

    Je ne suis pas sûr de bien comprendre.

  9. #9
    Membre éclairé Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Points : 773
    Points
    773
    Par défaut
    Personnellement je tenterais tout simplement un DELETE en mode PARALLEL forcé du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <DISABLE INDEXES : Sauf PK>
     
    delete /*+ PARALLEL(INF_CMD) */ ... 
     
    <REBUILD INDEXES : Tous>
    Sur ce genre d'opération je laisse toujours la PK accessible.

    Le MERGE est plus là pour faire du Multi-DML en un, côté I/O je ne pense pas qu'il accélère quoi que ce soit.

    Il faudrait voir les divers plans d'exécution pour comprendre pourquoi ici il semblerait plus rapide.
    Philippe CEROU,

    Architecte Systèmes & Bases de données.

Discussions similaires

  1. Fonction SQL & MERGE INTO
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 2
    Dernier message: 02/12/2009, 15h29
  2. Transcrire "Merge into"
    Par Ndrmar dans le forum SQL
    Réponses: 6
    Dernier message: 11/09/2008, 12h24
  3. SQL Merge into - delete ne marche pas
    Par Javotte dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/06/2008, 09h29
  4. Réponses: 4
    Dernier message: 11/10/2007, 08h51
  5. 9i : problème avec MERGE INTO
    Par Vld44 dans le forum SQL
    Réponses: 1
    Dernier message: 16/08/2007, 11h27

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