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

MS SQL Server Discussion :

SQL Serveur gourmand en ressources


Sujet :

MS SQL Server

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut SQL Serveur gourmand en ressources
    Bonjour, j'ai fait une application qui utilise SQL Serveur comme base de donnée de stockage.

    Quand on y insère en une fois plus d'un million d'enregistrements, SQL Serveur prend de plus en plus de mémoire pour monter jusqu'à 300Mo. Une fois les insertions terminées, il garde toute cette mémoire.
    J'ai vérifié avoir fermé la requête et la connexion une fois les données insérées. J'ai aussi vérifié que la transaction était fermée à la fin de l'exécution.

    Est-ce un fonctionnement normal de SQL Serveur de garder toute cette mémoire ? Et si non, comment peut-on lui demander de la rendre ?

    Merci.

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Salut,

    Selon mon expérience, c'est un fonctionnement normal de SQL Serveur.

    Je n'ai pas l'impression qu'il y ait de moyen de lui demander de retourner cette mémoire, mais je me rappelle que la consommation mémoire augmentait et n'étais pas libérée. Cependant, elle est libérée ensuite petit à petit, si tu observes bien le gestionnaire des taches.

    Peut être que fermer et réouvrir SQL Serveur par le biais d'un script serait une solution ?

    A+

  3. #3
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    Avez-vous configuré votre SQL Server en mémoire dynamique ? Avec un maximum ? Ou avez-vous tout laissé par défaut ? Dans ce dernier cas, partant du principe que plus il a de mémoire et plus il se porte bien ()= plus le cache de données est important), il se sert. A vous de le limiter.

  4. #4
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut, merci de m'avoir répondu si vite.
    Avez-vous configuré votre SQL Server en mémoire dynamique ? Avec un maximum ? Ou avez-vous tout laissé par défaut ? Dans ce dernier cas, partant du principe que plus il a de mémoire et plus il se porte bien ()= plus le cache de données est important), il se sert. A vous de le limiter.
    J'ai tout laissé par défaut, je ne suis pas administrateur de base de donnée, je ne m'y connais pas vraiment. Aurriez-vous des liens qui expliqueraient comment faire tout ça ?

    En fait, le vrai problème est que j'ai un utilisateur qui a 2+4 Go ( vive + virtuelle ) de mémoire et qui désire insérer 42 millions d'enregistrements. Et lors de l'insertion il a le message d'erreur :
    Out of memory
    qui vient du fait que toute la mémoire est utilisée et je me vois mal lui demander d'augementer encore sa mémoire virtuelle.

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Avez-vous configuré votre SQL Server en mémoire dynamique ? Avec un maximum ?
    En fait ma question est : est-ce qu'en limitant la mémoire totale utilisée par SQL Serveur lui permettra tout de même de travailler normalement même avec 45 millions d'enregistrements à insérer ?

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    il n'y a pas trop de raison d'avoir un out of memory avec 2 GB de RAM. Je n'ai jamais vu SQL Server mourir de manque de RAM. Etes-vous sûr que le message "out of memory" ne vient pas d'un autre process ?

    Le problème que vous pourriez rencontrer en insérant 45 mio de lignes est plus du côté du log de transaction, qui risque de se remplir pas mal. Si vous voulez essayer de limiter la charge, peut-être pouvez-vous tourner votre INSERT dans une boucle, ou importer les données en plusieurs fois si vous importez d'un fichier ou d'une source externe.

  7. #7
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par rudib
    il n'y a pas trop de raison d'avoir un out of memory avec 2 GB de RAM. Je n'ai jamais vu SQL Server mourir de manque de RAM. Etes-vous sûr que le message "out of memory" ne vient pas d'un autre process ?
    Pour l'instant, ce message n'apparaît que pendant l'insertion des données dans SQL Serveur, ce qui ne garanti forcément que cela vienne de lui. Cela peut venir de mon application qui fait l'insertion mais il est sûr que cela vient de cette insertion.

    Citation Envoyé par rudib
    Le problème que vous pourriez rencontrer en insérant 45 mio de lignes est plus du côté du log de transaction, qui risque de se remplir pas mal.
    Je fais des commit tous les 1000 enregistrements afin de ne pas trop charger ce travail.
    Citation Envoyé par rudib
    peut-être pouvez-vous tourner votre INSERT dans une boucle, ou importer les données en plusieurs fois si vous importez d'un fichier ou d'une source externe.
    L'insertion de fait automatiquement en fonction des données sources des utilisateurs, il serait laborieux de découper l'insertion en plusieurs parties et le choix de la taille des différentes insertions serrait assez arbitraire (il faudrait prendre en compte le nombre d'enregistrements, le nombre de colonnes, la mémoire de la machine...) et ferrait beaucoup de développement.

    En fait, ce que j'ai pu remarquer, c'est qu'à chaque insertion, SQL Serveur prend plus de ressources et ne les rend pas toutes, ainsi il augmente progressivement. Ce qui peut faire que les autre applications n'ont plus de ressources pour fonctionner et font des "Out of Memory". Je ne cherche pas à désigner SQL Serveur comme étant le coupable, mais j'aimerais savoir si c'est un fonctionnement classique de SQL Serveur ou si c'est mon application qui ne sait pas lui demander de rendre de la ressource.

    PS : pour récupérer des ressources, redémarrer le SQL Serveur sans fermer le processus ne rend pas ces ressources, il faut arrêter le processus et relancer SQL Serveur, mais ce n'est qu'une solution de bricolage que les utilisateurs finaux n'accepteront pas.

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Salut,

    Pour optimiser les insertions je pense que tu peux procéder à un BULK INSERT, en fournissant un fichier contenant tous tes inserts; c'est je pense optimisé, et ça consomme moins de mémoire.

    Utilises-tu la même connection pour faire tes insertions à partir de ton application ? Je veux dire par là, que si ça se trouve, ton application a un problème au niveau de la gestion des connections ( quel langage d'application ? )

  9. #9
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    J'utilise Delphi pour l'application.

    La connexion de la base de donnée source est dans ce cas aussi SQL Serveur mais il se peut très bien que d'autres clients aient d'autres bases de données sources.

    Citation Envoyé par KiLVaiDeN
    Pour optimiser les insertions je pense que tu peux procéder à un BULK INSERT,
    Ca veut dire que je dois faire une étape intermédiaire ? Charger les données sources dans un fichier puis insérer les données du fichier dans SQL Serveur ?
    Cela risque à priori de doubler les temps.

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 445
    Points
    3 445
    Par défaut
    Je ne suis pas sûr du tout que ça double le temps.

    J'ai souvent vu le cas d'un script SQL beaucoup plus rapide qu'une application manageant ce même processus. Donc tu pourrais être gagnant si le nombre d'actions sur la base est important.

    Dans ton application : Utilises-tu un pool de connection ? Pour chacun de tes inserts (à chaque itération), fais-tu une création d'objet ? Peut-être est-ce là une perte en performance.

    Je ne sais pas trop quoi d'autre te dire à ce sujet. Bonne chance

    A+

  11. #11
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Comme normalement SQL Server tourne plutôt sur des machines dédiées, il n'est pas gênant qu'il prenne les ressources. Pour la mémoire, en effet je ne l'ai jamais vraiment vu la rendre. Bref, c'est un comportement classique. Microsoft recommande en général de dédier son serveur à SQL. Si tu travailles avec de tels volumes de données, ça commence sans doute à être une bonne idée. Sinon tu peux touojurs limiter le max memory de SQL Server. Tu souffriras alors de problèmes de lenteur en lecture (manque de cache de données).
    Une autre source de lenteur peut venir du disque. Si tu lis ta source, et écris le log de transaction et les data sur le même disque, il risque d'y avoir un peu de contention. Avec qq indicateurs de perfmon tu peux suivre un peu ça (jette un oeil sur mon site à http://www.babaluga.org/doku.php/sql...stration/index pour quelques pistes).

    Si tu peux placer ton appli Delphi sur une autre machine, c'est peut-être une bonne solution, ou de laisser SQL gérer l'insertion des données, par bulk insert ou DTS.

    Ah, ok, j'ai compris : tu veux d'abstraire du type de SGBD. Pour SQL Server, le bulk insert va être bien plus rapide.
    Autre question: as-tu des index ou des contraintes (check, clé étrangères..) sur ta table. Pour les index et les contraintes, il vaut mieux les dropper et le recréer après l'insert. En cas de trigger, tu peux les disabler avec un ALTER TABLE

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    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 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    Ajouter 45 millions de lignes en une seule transaction c'est sans doute cela qui cause cet out of memory.

    Tout dépend de comment vous faîtes l'ajout.

    Si c'est à partir d'un fichier texte, vous pouvez parcéliser ce fichier en multiples lots.
    Intéressez vous à la commande BULK INSERT et à l'option KILOBYTES_PER_BATCH, sinon prpgrammez une boucle qui insère n ligne (par exemple 5000 lignes). Le mieux étant de calculer que le nombre de ligne représente un multiple de l'extension qui est de 64 Ko.

    A +

  13. #13
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Bonjour et merci de vouloir m'aider.

    En fait, c'est un oubli de ma part, la base de donnée qui reçoit les 45 millions de lignes est en SQL Serveur, mais il est possible que l'utilisateur choisisse une autre base de donnée, il peut aussi prendre Firebird/Interbase, Oracle et MySQL, donc il ne m'est pas possible de faire un développement spécifique pour SQL Serveur.

    Je fais l'ajout des 45 millions de ligne en 1 fois mais en faisant plusieurs transactions, chaque transaction prenant 1000 enregistrements.

Discussions similaires

  1. savoir si un user est connecté et ressources SQL/serveur
    Par newbie_php dans le forum Langage
    Réponses: 1
    Dernier message: 24/02/2011, 22h24
  2. RoR est-il gourmand en ressources serveur ?
    Par XavierWRC dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 27/03/2008, 12h35
  3. Taille Maxi pour un SQL SERVEUR 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 21/07/2003, 09h37
  4. Supprimer une colonne sous SQL Serveur 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/07/2003, 12h24
  5. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44

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