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 SELECT en NOLOGGING & APPEND [11gR2]


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut INSERT SELECT en NOLOGGING & APPEND
    Bonjour les Experts ,
    J'ai une table partitionnée que je truncate (uniquement une partition à truncater) au début de mon traitement batch.
    A un certain moment du traitement un INSERT ...SELECT lourd vient alimenter cette partition de la table.
    Puisque ma base est en mode NOARCHIVE et que ce traitement est rejouable si erreur , est-ce que je pourrais envisager :

    1/ un INSERT ...SELECT en mode NOLOGGING.
    Les redo logs ne sont pas utiles dans mon cas ? risque ?

    2/Utiliser aussi le mode APPEND dans cette insertion qui normalement ne devrait locker que la partition en question (Les autres partitions restent accessibles en dml ?).
    En plus aucun souci de fragmentation causé par l'append car re-truncate de la partition au prochain passage du même batch.

    Bref , le nologging et append est-il dangereux dans mon contexte sachant que la base est sauvegardé chaque soir par une sauvegarde BCV et que en cas de crash matériel un retour à cette sauvegarde est envisagé ...

    3/ Pour finir quand une partition d'une table est "truncaté", que se passe-t-il pour l'index local ? est-ce que la partition équivalente de l'index est aussi "truncaté" automatiquement ou je risque d'avoir un index très fragmenté suite à plusieurs truncate de la partition de table ?
    merci

  2. #2
    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,

    La base n'est pas en archivelog mode. Donc pas besoin de préciser NOLOGGING: tous les chargements en direct-path se feront en NOLOGGING.

    La raison: en direct-path on écrit directement dans les datafiles, sans passer par la SGA. Donc pas besoin de redo log en cas de crash d'instance.

    Par contre, un insert conventionnel ( INSERT ... SELECT s'il n'y a pas le hint APPEND ) va générer du redo: les modifs se font en mémoire, il faut que ces modifs soient protégées en cas de crash d'instance.

    Utiliser aussi le mode APPEND dans cette insertion qui normalement ne devrait locker que la partition en question
    Seulement si la partition est précisée dans l'insert avec le nom de la table.

    Oui le truncate d'une partition vide l'index aussi.

    Donc en bref:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ALTER TABLE nom_table TRUNCATE PARTITION nom_partition;
    INSERT /*+ APPEND */ INTO nom_table PARTITION(nom_partition) SELECT ...
    Cordialement,
    Franck.

  3. #3
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Par défaut
    Bonjour,

    Pour répondre à ta question n°3, c'est oui.

    L'avantage d'un index local, c'est que tu n'as pas à t'en soucier. Que tu fasses un TRUNCATE, mais aussi un SPLIT ou un MERGE de partitions sur une table, Oracle effectue la même chose sur les partitions de tous les index locaux de ta table.

    Par contre, si ta table possède en plus des index globaux, ou des index non partitionnés, c'est à toi de les gérer.



    Sinon je suis d'accord avec les propos de Pachot, à un détail près.

    De manière générale, pour faire de l'insertion en Bulk sur une table, il ne faut pas qu'il y ait d'index, ou bien il faut le rendre inutilisable (UNUSABLE).

    Dans ton cas donc, avant de faire du Bulk Insert dans la partition de la table, il faut donc penser, sur les index locaux, à passer la partition concernée par le chargement en UNUSABLE.

    Une fois le chargement fait, il ne reste plus qu'à rebuilder cette partition.


    Sauf erreur de ma part, voilà ce que cela doit donner avec 2 index locaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ALTER TABLE nom_table TRUNCATE PARTITION nom_partition;
     
    ALTER INDEX nom_index_1 MODIFY PARTITION nom_partition UNUSABLE ;
    ALTER INDEX nom_index_2 MODIFY PARTITION nom_partition UNUSABLE ;
     
    INSERT /*+ APPEND */ INTO nom_table PARTITION(nom_partition) SELECT ...
    COMMIT ;
     
    ALTER INDEX nom_index_1 REBUILD PARTITION nom_partition ;
    ALTER INDEX nom_index_2 REBUILD PARTITION nom_partition ;

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Deux remarques s'imposent à mon humble avis

    1) il faudrait rappeler que le direct path load peut être silencieusement ignoré si la table possède un trigger ou une contrainte d'intégrité.

    2) par rapport à la remarque de rouardg concernant la mise dans un statut UNUSABLE des indexes locaux (uniquement ceux correspondants à la partition touchée par l'insert) c'est exactement ce que j'ai fait et cela a plus ou moins bien fonctionné. Par contre, comme la maintenance des indexes lors d'un direct path load est très performante (bulk insert à la fin), il serait intéressant de comparer les deux cas:

    (a) direct path load avec indexes locaux "unusable"
    (b) direct path load avec tous les indexes en place.

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

    L'approche unusable/rebuild est à mon avis toujours plus rapide sur une partition vide, d'autant plus qu'on évite de devoir recalculer les stats de la partition d'index.

    Cordialement,
    Franck.

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant
    Inscrit en
    Mai 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mai 2006
    Messages : 147
    Par défaut
    bonjour
    le tablespace , la table et la partition sont en mode logging.
    par contre la base est en mode noarchivelog.
    un dml sur la table effectue t il une ecriture dans les redo log ?
    comment verifier cela ?
    merci

+ 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. [VBnet][Access] Requete imbriquee "insert + select"
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/03/2006, 13h58
  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