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 :

INSERT INTO SELECT + DBLINK 9i/10g


Sujet :

Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut INSERT INTO SELECT + DBLINK 9i/10g
    Bonjour,

    J'ai 2 BDD :
    - BDD9i est une 9i
    - BDD10g est une 10g
    je souhaite inserer des records issus d'une requete de ma BDD9i vers une table de ma BDD10g

    Quand je fais un

    INSERT INTO matableremote@BDD10g
    SELECT t1.champ1,t2.champ1,t3.champ1
    FROM matable1 t1, matable2 t2, matable3 t3
    avec tout plein de where....

    Il met environ 2 minutes pour copier 15 records...
    Et il ne me rends jamais la main avec 50000 records.

    Si je passe par une table temporaire avec un
    create matabletemp as
    SELECT t1.champ1,t2.champ1,t3.champ1
    FROM matable1 t1, matable2 t2, matable3 t3
    avec tout plein de where....

    il met 20 secondes pour creer la table de 50000 records
    et le
    INSERT INTO matableremote@BDD10g
    SELECT champ1,champ2,champ3 from matabletemp
    met 15 secondes ...

    Une idée ???

  2. #2
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    oui, il fait des jointures à travers le réseau...

    La règle est la suivante:

    - quand toutes les tables d'une requête sont issues du même dblink, oracle exécute entièrement sa requête sur le site distant

    - quand la requête concerne des tables sur plusieurs db_links différents ou sur un mélange db_link / local, oracle choisi en fonction de critères mystèrieux (enfin pour moi en tout cas)

    Quand tu fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into table_distante@DLINK 
     select machin, bidule 
    from table_locale1, table_locale2 etc...
    Il considère qu'il est dans le 2ieme cas donc il peut choisir de faire certaines opérations en local et certaines en distant. tu peux le voir en éditant le plan d'exécution.

    Par exemple imagine qu'il doivent faire une jointure par HASH entre 2 accès complets sur 2 tables locale puis insérer le tout sur une table distante. Tu vas t'attendre à ce qu'il fasse sa cuisine en local et qui insère le tout à la fin.... Et bien parfois, il choisi de balancer le contenu complet de tes 2 tables dans ton db_link et faire l'opération de jointure sur la base distante!

    Ceci à comme double effet:
    - de rendre la procédure tres longue
    - de saturer complètement le réseau

    Théoriquement, en passant les stats sur les 2 bases, il est censé choisir le bon plan, mais dans la pratique, il se plante trés souvent. C'est pourquoi, il faut éviter de faire des requête avec jointures compliquées (meme avec jointure tout court...). La méthode la plus stable est de faire une vue de manière à ce que ta requête devienne un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into table_distante@DBLING
     select machin, bidule, etc... 
      from vue_locale
     where truc = bazard
      and etc...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut
    Merci pour ta reponse rapide...

    Je comprends bien ce que tu dis... seulement meme en passant par une vue le traitement est tout aussi long.

    alors que le select * de cette vue est super rapide...

    La seule soluce (pour moi...) pour l'instant c'est une table temporaire a defaut de trouver mieux
    Je continue a chercher de mon coté...

    @+

  4. #4
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par dbaenbois
    meme en passant par une vue le traitement est tout aussi long.
    tiens... moi j'avais été confronté au problème en 8i, et cette méthode fonctionnait bien (elle était même préconisée sur le metalink si je me souviens bien...)

    Est-ce que tu as essayer d'utiliser le hint /*+ MERGE (la_vue) */ ?


    Citation Envoyé par dbaenbois
    alors que le select * de cette vue est super rapide...
    c'est rapide sur l'ensemble ou c'est toad (ou autre outil ne fetchant que le début du curseur) qui te renvoi les premières lignes rapidement ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut
    ... pas mieux avec le hint /*+ MERGE (la_vue) */ (merci quand meme )

    J'utilise sqlplus sous linux...
    Et quand je dis c'est rapide, l'affichage de mes lignes est instantané....

  6. #6
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    pas mieux avec le hint /*+ MERGE (la_vue) */


    euh... quand je dit "la_vue" il faut remplacer par le nom ou l'alias de la vue que tu utilises, on est bien d'accord ?

    Il faudrait éditer le plan d'exécution pour en avoir le coeur net, il va y avoir l'étiquette "REMOTE" à chaque fois qu'il décide d'envoyer un flux dans le dblink.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut
    euh... quand je dit "la_vue" il faut remplacer par le nom ou l'alias de la vue que tu utilises, on est bien d'accord ?
    Mort de rire !!!

    Effectivement je met bien le nom de ma vue...

    Dans mon plan d'execution j'ai bien des SERIAL_FROM_REMOTE ...

  8. #8
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Dans ta vue, tu n'a que des tables en local ou tu as d'autres db_link ?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut
    j'ai un autre dblink... sur une 3eme BDD en fait... en 9i celle la...
    c grave Doc ?

  10. #10
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Salut,
    Selection rapide, insertion plombée :
    A tout hasard, il ne s'agirait pas du bug 2262861 ?

    http://www.developpez.net/forums/sho...d.php?t=170051

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 26
    Par défaut
    Ca m'en a tout l'air....

    En tous cas ... Merci... Merci à tous !

    Reactivité, rapidité, efficacité... a bientôt

  12. #12
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Citation Envoyé par dbaenbois
    j'ai un autre dblink... sur une 3eme BDD en fait... en 9i celle la...
    c grave Doc ?
    oui!!

    Déja qu'avec 2 bases l'optimiseur se prend facilement les pieds dans le tapis, alors avec 3, j'ose pas imaginer le massacre... En fait il doit s'amuser à faire des jointures sur ton 3ieme site....

    Donc soit tu tente de continuer la méthode en faisant une vue sur ton 3ieme site regroupant toute les tables concernées, soit tu garde ta methode en passant par une table temporaire intermédiaire. Personnellement, j'ai tellement passé de temps à tenter d'optimiser ce genre de requête distribuée que depuis j'ai développé une alergie et je simplifie au maximum tout ce qui passe par un db_link.

    Citation Envoyé par chrifo
    Salut,
    Selection rapide, insertion plombée :
    A tout hasard, il ne s'agirait pas du bug 2262861 ?

    http://www.developpez.net/forums/sho...d.php?t=170051
    Je pense pas que ce soit exactement ça, mais y'a un rapport, c'est d'ailleurs surement en consultant cette note que j'ai découvert la methode des vues...

  13. #13
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Citation Envoyé par remi4444
    c'est d'ailleurs surement en consultant cette note que j'ai découvert la methode des vues...
    Oui c'est vrai que les vues c'est LA solution

    Ca se complique quand on ne peux pas créer d'objet sur l'instance distante ... dans ces cas là on est forcé d'imaginer des méthodes à base de curseurs et de boucles d'insertion

Discussions similaires

  1. SQL : syntaxe insert into select
    Par chrislauxerrois dans le forum Access
    Réponses: 15
    Dernier message: 31/07/2006, 17h12
  2. [Oracle 9] Anomalie insert into select
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/05/2006, 15h11
  3. probleme dans un INSERT INTO...........SELECT
    Par briiice dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/01/2006, 16h13
  4. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 15h39
  5. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 18h32

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