none
SQL Server occupation mémoire des processus RRS feed

  • Question

  • Bonjour,

    J'ai une application qui fonctionne 24h/24 et qui insère en permanence des enregistrements dans une table.

    J'ai remarqué que l'occupation mémoire de mon application et du processus "SQL Server Windows NT - 64 Bit" augmente sans arrêt.

    Il s'agit d'une base localdb (2014), les fichiers de la base (.mdf et .log) ne sont jamais mis à jour sur le disque: la date de modification reste sur la dernière date de l'arrêt de l'application.

    Il semblerait que les enregistrements insérés restent dans un cache mémoire de SQL Server (ce qui explique peut être l'augmentation de l'occupation mémoire).

    Existe-t-il un moyen de forcer le transfert des enregistrements sur disque?

    Contexte du développement: .NET, C#, EntityFramework.

    Cordialement,


    Jmb

    vendredi 4 septembre 2020 07:22

Toutes les réponses

  • Bonjour,

    Au passage une idée qui vaut ce qu'elle vaut ...

    Il y a moyen d'écrire les enregistrements dans une autre table, et sur celle-ci avoir un déclencheur qui va transférer l'enregistrement vers la table réellement visée.

    Ça peut nécessiter un travail sur les clefs externes.

    Faute que quelqu'un vienne valider ça, il faudra passer du temps à le développer puis le tester, chronomètre à la main, pour savoir si ça valait le coup.

    mardi 29 septembre 2020 12:59
  • Je crois qu'il faudrait vider la mémoire du bufferen utilisant l'une des commandes suivantes:
    DBCC FREESYSTEMCACHE
    DBCC FREESESSIONCACHE
    DBCC FREEPROCCACHE
    
    mardi 6 octobre 2020 11:44
  • Bonjour

    Partez du principe que l'intégralité des requêtes s'exécute en mémoire dans SQL Server. Ce qui est vrai, à l'exception de Restore Database.
    Ce qui veut dire que le transfert de données du disque vers la mémoire, ou inversement n'est pas l'affaire du développeur, mais de SQL Server lui même.
    Pour faire simple, le processus CHECKPOINT va scanner les dirty pages en mémoire et écrire ces pages dans le/les fichier(s) de données. Quand ? cela dépend du modèle de récupération et du paramétrage de l'intervalle de récupération, voir de l'indirect checkpoint. Peut importe.

    Et même lorsque cela sera fait, SQL Server gardera les données en mémoire, sauf qu'il a besoin de place dans le buffer pool pour traiter une autre requête ou bien stocker des données qui ne sont présentes que sur disque (cf: fonctionnement de la freelist, lazy writer).
    Donc même en forçant un checkpoint, ce que vous pouvez faire, c'est un vrai ordre T-SQl, les données seront toujours en mémoire.
    Si vous souhaitez limiter la taille du buffer pool, il faut fixer le max server memory.

    Mais je vous suggère d'abord d'abandonner LocalDB pour passer sur une "vrai" édition de SQL Server, même Express.

    Cdlt
    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 8 octobre 2020 12:46
  • Non, cela va vider les caches, dans le buffer pool, mais ne va pas diminuer l'emprunte mémoire.

    Cdlt
    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 8 octobre 2020 12:48
  • Heuu, pour quoi faire, je ne saisis pas le but ?

    Cdlt
    Christophe


    Christophe LAPORTE - Independent Consultant & Trainer - SQL Server MVP-MCM

    jeudi 8 octobre 2020 12:48