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 :

[Optimisation] Insert Select


Sujet :

Oracle

  1. #1
    fab
    fab est déconnecté
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Par défaut [Optimisation] Insert Select
    Bonjour,

    J'ai déjà posté dans le forum SQL mais je n'ai pas eu de réponse claire. Le problème vient peut être de ma base.

    J'ai une requete select assez importante. Je l'optimise et finit par avoir mes 1748 lignes en quelques secondes. Parfait.

    Je veux insérer ce résultat dans une autre table avec un INSERT INTO () VALUES (SELECT...)

    J'ai bien suivi les instructions d'optimisation préconisé : type de colonne identique et nommage des colonnes dans la 1ere partie du INSERT.

    Malgré cela le temps d'insert est vraiment très long : plusieurs dizaines de minutes !

    Pour info j'utilise des DB LINK.

    Quel peut-être le problème ?

    Merci

  2. #2
    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
    Bonjour,
    Vous faites peut-être le select sur l'instance distance (via /*+ DRIVING_SITE=<table> */ par exemple).
    Lorsque vous passez en insert, Oracle exécute le select depuis l'instance locale, ce qui le plombe complètement. Je crois que ce pb est un bug référencé ...

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il ne faut pas utiliser VALUES si c'est par SELECT

    Tu peux passer les indexes à USUSABLE et les rebuilder en fin d'insert, désactiver les contraintes et les triggers et utiliser le hint APPEND... tu peux aussi passer la table en NOLOGGING le temps de l'insert.

  4. #4
    fab
    fab est déconnecté
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Par défaut
    Merci pour vos réponses.

    Je ne met pas le VALUES, c'était pour expliquer le principe, désolé.

    J'ai déjà lu pas mal de questions et papiers sur le sujet, j'ai bien essayé de désactiver les index, mettre le /*+ APPEND */, etc.. mais sans succès.

    Pour le bug, l'explication me semble bien correspondre au problème. Je n'ai rien trouvé sur metalink d'oracle. J'ai peut-être mal cherché.
    Avez vous plus d'info à me de donner ?

    Merci encore

  5. #5
    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

  6. #6
    fab
    fab est déconnecté
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Par défaut
    Ok, . Il n'y a apparemment pas de solution, Oracle ne semble pas vouloir traiter ce bug.

    Tanpis, je contourne en passant par une procédure stockée, For (select...) loop insert... end loop;

    C'est moins élégant mais cela marche rapidement.

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pense au bulk collect dans ce cas

  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 piste...
    Si le select est un peu compliqué (impliquant plusieurs tables), l'optimiseur oracle a parfois la "bonne" idée de ramener toutes les lignes de certaines tables et de faire sa jointure en local.... ça se voit en éditant le plan d'exécution (plusieurs branches se terminant par "remote").

    Explication:
    - Si on fait un select avec toutes les tables faisant partie du meme db-link, oracle execute toutes les jointures sur le site distant et ramène le resultat.
    - Si on fait des jointures entre des tables locale et distantes, ou entre plusieurs db-link différents alors l'obtimiseur choisi...
    -> le gros défaut est que lorsque on fait un insert dans un table locale d'un select distant, oracle considère qu'il est dans le 2ieme cas, donc l'optimiseur choisi, et pas toujours bien...

    J'y ai personellement passé des nuits blanches sur ce genre de saloperies...
    La solution la plus stable (et préconisée par oracle si je me souviens bien) est de se débrouiller à faire une vue sur le site distant (celui du select) de manière à simplifier au maximum la requête pour n'arriver qu'a un simple truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE_LOCALE SELECT * FROM VUE_DISTANTE@DB_LINK WHERE truc=machin .....
    Si tu as fait ta procédure sur le site ou tu fais tes selects, c'est stable aussi.
    De toutes manières, il ne faut pas perdre son energie à bricoler des insert/select compliqués à travers des db-link, car meme si ça a l'air d'etre rapide, on ne peux pas controler le taux d'utilisation du réseau et on n'est pas à l'abris d'un changement de plan d'exécution....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. Optimisation insert select
    Par fab dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2006, 17h13
  3. INSERT + SELECT TOP...argument incorrect
    Par samlepiratepaddy dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 12/09/2005, 01h10
  4. [insert][select] Subqueries not allowed
    Par Invité dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/09/2005, 11h56
  5. insert-select sur 2 base différente
    Par gskoala dans le forum Paradox
    Réponses: 2
    Dernier message: 16/11/2004, 15h11

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