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 :

Mass Insert dans une table & commit


Sujet :

SQL Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Mass Insert dans une table & commit
    Bonjour,

    Petit nouveau sur ce forum, j'ai une petite question par rapport à mon code.

    J'ai une requête de ce style :

    INSERT INTO TABLE A
    SELECT *
    FROM TABLE B

    Ma table B est énorme genre 6 millions de lignes.
    Je ne fais qu'un commit à la fin.
    Y a t'il un risque que le serveur crash ?

    Peut on dans une simple requête SQL spécifier à oracle de commiter à toutes les n insert, genre tout les milions d'insert ?

    Sinon comment gérer un insert d'une table énorme ?
    Je dois splitter ma table B en table B1,B2,...Bn ?
    Comment la splitter de maniere propre

    Merci d'avance du retour

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 95
    Points
    95
    Par défaut
    Pour créer ta table B, le mieux est de faire create table B as select * from table A.

    Après pour ce qui est des considérations de type organisation de table, tu peux déjà partitionner ta table, ça t'aidera pour toutes les requêtes utilisant la colonne sur laquelle tu partionnes.

  3. #3
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Fait attention à la taille des ROLLBACK SEGMENTS (si tu es en 8.1.7 tout du moins) !
    NB : Je crois qu'en version >8, ceux ci sont remplacés par des UNDO TABLESPACE
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  4. #4
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Ok mais comment marche le partitionnement Oracle ?

    Ca sert à splitter une table suivant un critere ?

    Genre 5000eme enregistrements dans table B1
    50001eme à 10000eme enregistrements dans table B2 ?

  5. #5
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Le partitionnement peut se faire
    - par valeurs (exemple : sur la colonne pays qui peut prendre les valeurs 'France', 'Belgique', 'Suisse'...) . Il faut qu'une partition soit prévue pour chaque valeur possible de cette colonne
    - par range (exemple sur une colonne date : partition 1 pour dates < 01/01/2000, partition 2 pour dates entre 01/01/2000 et 01/01/2001, partition 3 pour dates entre 01/01/2001 et 01/01/2002, ... etc)
    - partition par hash (sans critère particulier, ca sert juste à répartir équitablement tes données sur les différentes partitions, si ta clé de partitionnement est unique ou quasiment, par exemple la primary key)

    Le partitionnement sert surtout à améliorer la gestion de la table pour les opérations de maintenance, purge, ... et . Par exemple si tu veux supprimer toutes les lignes pour le pays 'France' , tu fais un truncate de la partition 'France' au lieu d'un "delete from table where pays = 'France', ca te permettra de libérer l'espace

    Mais dans ton cas précis, si la table A est vide à la base, c'est effectivement mieux de la dropper puis de faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CREATE TABLE A AS SELECT * FROM TABLE B;
    Sinon si la table A n'est pas vide il suffit juste d'avoir un tablespace UNDO (si tu es en 9i ou 10g) de taille suffisante (au pire met le en autoextend si tu n'es pas sûr), et ne faire le commit qu'à la fin. Le nombre de lignes de ta table B à copier n'est pas un problème en soi
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Attention à ces solutions toute faite. D'abord, le partitionnement est une option qui est assez onéreuse, ensuite pour 6 millions de lignes ça me parait un peu excessif comme solution sachant que ça peut dégrader les perfs si c'est mal fait.

    Pour répondre à la question, sous SQL*Plus, il existe la commande COPY qui permet de faire un INSERT avec des commits intermédiaires ce qui évite une consommation trop importante des rollbacks.

  7. #7
    Candidat au Club
    Inscrit en
    Août 2007
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour les réponses

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

Discussions similaires

  1. [ZEOSLIB] Problème Insertion dans une table
    Par moscovisci dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/06/2005, 12h05
  2. [interbase6]probleme d'insertion dans une table
    Par macadam314 dans le forum Bases de données
    Réponses: 10
    Dernier message: 22/02/2005, 14h21
  3. [Sybase] Temps d'une insertion dans une table
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 14/02/2005, 10h04
  4. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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