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

Développement SQL Server Discussion :

SystemOutofMemory suite à un import de données


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut SystemOutofMemory suite à un import de données
    Bonjour,

    Je me pose des questions sur un problème que j'ai rencontré en voulant importer le contenu d'un fichier excel dans une de mes bases de données.

    J'execute pour cela un petit bout de code T-SQL qui ressemble à cela :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SELECT * 
    INTO #myExcelData
    FROM OPENROWSET (      
      'Microsoft.ACE.OLEDB.12.0',
      'Excel 8.0;Database=c:\Fichier.xls;HDR=YES;IMEX=1', 
      'SELECT Civilité,Nom,Prénom,Fonction,Organisme,Adresse1,Adresse2,CP,Ville,Téléphone,Fax,Email FROM [Export$]'
    )
     
    declare row_cursor cursor for select Civilité,Nom,Prénom,Fonction,Organisme,Adresse1,Adresse2,CP,Ville,Téléphone,Fax,Email from #myExcelData
     
    open row_cursor 
    fetch next from row_cursor into @ADRCONTACTINTITULE,@ADRCONTACTNOM,@ADRCONTACTPRENOM,@ADRCONTACTFONCTION,@ORGANISME,@ADR1,@ADR2,@ADRCP,@ADRVILLE,@ADRTEL,@ADRFAX,@ADRMAIL
    while @@FETCH_STATUS=0
    begin
         INSERT INTO ....
     
          INSERT INTO ....
     
        fetch next from row_cursor into @ADRCONTACTINTITULE,@ADRCONTACTNOM,@ADRCONTACTPRENOM,@ADRCONTACTFONCTION,@ORGANISME,@ADR1,@ADR2,@ADRCP,@ADRVILLE,@ADRTEL,@ADRFAX,@ADRMAIL
    end
    close row_cursor
    deallocate row_cursor
    Lorsque j'execute ce code sur le serveur, un systemOutOfMemory apparait sur la fin du traitement.
    Les insert into réalisés dans la boucle font appels à des triggers qui eux-même font des insert. L'erreur ne se produit pas sur tous les serveurs (seulement ceux ayant une configuration mémoire moindre)
    J'en ai donc déduis qu'il s'agissait d'un problème de verrous mais je ne comprends pas comment cela peut se produire puisque le traitement est lancé lorsqu'il y a aucun accès concurrent.
    Le code n'est il pas exécuté de manière purement séquentiel? Est il possible qu'une nouvelle itération de ma boucle commence avant même qu'un trigger déclenché par l'itération précédente est terminé son traitement?

    Merci d'avance pour vos lumières.

  2. #2
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 117
    Points
    117
    Par défaut
    Avec l'utilisation d'un curseur, tu as N instruction insert, donc N appel aux triggers.

    Dans cette configuration, je te conseille de désactiver les triggers le temps de l'import et relancer a "mano" les traitements effectué par les triggers
    (attention, ceci n'est possible que si tu fais ton import en dehors de la période de production, car la désactivation des triggers concernera tout le monde !)

    Sinon, une autre solution consisterai a supprimer le curseur que tu as et de modifier la requete afin de faire qu'un seul gros Insert ( ou 2 dans ton cas visiblement)
    ce qui permet d'avoir qu'un seul appel aux triggers de la table concernée, cela peut améliorer grandement les perfs si il y a beaucoup de triggers complexes.


    Sans connaitre le contenu de ta boucle, difficile de dire si le traitement peut facilement se passer de curseur

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Merci pour votre réponse.
    Malgrès cela, j'ai du mal à comprendre ce problème de mémoire.
    les instructions sont faites les unes après les autres. Il n'y pas d'accès concurrent. Les ressources ne sont donc t-elles pas libérées au fur et à mesure?

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2008
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2008
    Messages : 103
    Points : 87
    Points
    87
    Par défaut
    Bonjour,

    J'ai rencontré auparavant des pb de mémoires sur des traitements longs, je ne sais plus si le message était tout à fait le même mais pour y pallier au lieu d'afficher le résultat de la requête par grille, je passais par "Résultats dans du texte" au niveau des options de MS "Résultats de la requête"... peut être une piste ?

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par djseb182 Voir le message
    Merci pour votre réponse.
    Malgrès cela, j'ai du mal à comprendre ce problème de mémoire.
    les instructions sont faites les unes après les autres. Il n'y pas d'accès concurrent. Les ressources ne sont donc t-elles pas libérées au fur et à mesure?
    Un batch = 1 seule transaction => empilement des mises à jour....
    Donc, consommation mémoire !

    De plus vous utilisez tout ce qu'il y a de pire au niveau consommation de ressources :
    1) fonction OPEN...
    2) curseur
    3) déclencheurs
    ...

    Un SGBDR est optimisé pour faire du code ensembliste ! Pas du ligne à ligne remodifiées par déclencheur et lues par une fonction itérative !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/05/2012, 14h37
  2. [CR]Importer des données d'une feuille excel
    Par rolan dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 17/12/2004, 22h32
  3. Réponses: 3
    Dernier message: 13/12/2004, 13h54
  4. Importer des données dans sql server avec DELPHI ???
    Par moutanakid dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2004, 17h22
  5. Importation de données postgresql
    Par ythierrin dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 10/10/2003, 22h18

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