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-SERVER 2000] Mettre une table en mémoire


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut [SQL-SERVER 2000] Mettre une table en mémoire
    Bonjour,

    J'ai un problème de performances sur une requête SQL. Le plan d'exécution m'indique que le bon index est pris et que je peux difficilement l'optimiser plus que cela.
    La table fait 1 million d'enregistrement. Le serveur est un quadri-processeur avec 4Gb de RAM (même si seulement 3,5 Gb sont reconnus ... Windows server 2000).
    Cette table contient des données par societe. Les utilisateurs la consultent via une application. En fait, selon que les utilisateurs lancent leur requêtes sur une societé, la première exécution est très longue (environ 5/6 minutes pour une dizaine d'enregistrements). Mais s'ils la relancent dans la foulée, c'est rapide (car les données sont dans le buffer cache). Mais si quelqu'un d'autre le lance sur une autre socièté, le buffer cache est vidé, et rebelotte pour la deuxième société. Et cela tout le long de la journée.
    En traçant la requête, je me rend compte que c'est le sp_cursorfetch qui est très long. (en lançant la requête dans un analyseur de requête, elle met une vingtaine de secondes). C'est l'utilisation des curseurs qui plombe l'appli.

    Une des solutions à la quelle j'ai pensé serait (si c'est possible) de forcer la table dans le buffer cache d'office (comme l'on pourrait le faire avec les tables bufferisées sous Oracle). Mais serait-ce raisonnable (edit : personnellement je ne pense pas ...) pour une table d'un million d'enregistrements ? Si c'est faisable, comment faire ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 994
    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 994
    Billets dans le blog
    6
    Par défaut
    Vous avez visiblement beaucoup de problèmes et franchement je pense (à vue de nez) que votre problème n'est pas franchement soluble...

    Votre problème est apparament un défaut de cache. Cela fait que les lignes des tables nécessaire aux requêtes montent en mémoire mais sont déchargées parce que d'autres requêtes ont besoin de placer les lignes d'autres tables en mémoire.
    Si vous envisager de forcer la table en mémoire, par exemple avec un DBCC PINTABLE, alors le remède risque d'être bien pire que le mal. En effet ce seront d'autres tables qui ne pourront être mises en mémoire... Donc des temps de requêtes bien plus longs et très erratiques !

    Vous dite que c'est le curseur qui rame. En général programmer à l'aide des curseur est généralement la pire des solutions en matière de performances. SI vous voulez des perfs, commencez par éliminer la plupart des, curseurs (lorsque j'intervient en audit j'enlève environ 80% des curseurs des dévelopeurs en V 2000 et près de 100% en v 2005). Prévoyez aussi une bonne indexation.
    Une bonne indexation réduit drastiquement les coûts des SELECT.

    Ce que je crois c'est que vous devrier commencer par auditer le "cache hit ratio" du buffer manager (gestionnaire de tampon / Taux d'accès au cache...)
    Si ce paramètre est en moyenne inférieur à 95%, cela est mauvais. Si, il est inférieur à 90 c'est exécrable. En dessous, c'est pourri ! Un bon cache hit ratio, commence à 98%...
    Maitenant il vous reste différentes solutions :
    1) rajouter de la RAM (solution de facilité) mais dans votre cas il est probable qu'il faille changer d'édition de Windows.
    2) réduire la fenêtre des données exploitées (et là c'est déjà plus costaud...)
    Bref, inspirez vous des papiers que j'ai écrit sur l'optimisation des données dans MS SQL Server. Les 3 premiers sont disponible sur mon site d'entreprise SQL spot à :
    http://www.sqlspot.com/Voulez-vous-optimiser-votre.html
    Les deux suivants sont parus récemment dans SQL Server magazine.

    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/ * * * * *

  3. #3
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    Bonjour et merci de la réponse.
    Le problème est que l'application utilisée est une application commerciale propriétaire. Donc nous ne pouvons pas toucher au code en soit. Donc il nous est impossible de modifier le comportement et l'utilisation des curseurs.
    De plus, en regardant la requête utilisée, l'index à prendre y est forcé (clause INDEX nom_index dans la requête). Donc pas moyen non plus de créer un autre index. Mais là ce n'est pas trop grave car l'index utilisé reprend les colonnes de la clause WHERE et dans l'ordre. Donc on va dire que ça passe.
    Pour ce qui est des curseurs, je suis d'accord ... mauvaise solution. Mais pareil, on ne peut rien changer.
    Une question me turlupine quand même ... C'est l'utilisation en mémoire de SQL server. Il est parametré pour utiliser dynamiquement la mémoire sans limites. Or je vois qu'il se limite à utiliser 1,7Gb. Jamais plus. Et donc j'ai toujours à peu près 1,5Gb de libre sur le serveur. Pourquoi ne prend-t'il pas le reste ? S'il en a besoin pour son buffer cache ne peut-il pas prendre plus ? Est-ce lié à la valeur max server memory qui est limitée à 2Gb ? Comment utiliser plus ?

    EDIT : je viens de trouver ce lien : http://support.microsoft.com/kb/274750
    je vais regarder ça de plus près ... Si le buffer cache est plus gros, ça devrait résorber (un peu) le problème de temps de réponse que nous avons ...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 994
    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 994
    Billets dans le blog
    6
    Par défaut
    La version 2000 n'utilise pas directement le 3 GB mais est seulement capable de 2 GB au max. Regardez aussi la version de Windows...

    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/ * * * * *

  5. #5
    Membre expérimenté
    Inscrit en
    Octobre 2005
    Messages
    344
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 344
    Par défaut
    Bonjour,

    J'ai vérifié aujourd'hui le "cache hit ratio" du buffer manager (dans perfmon, j'ai pris l'option Gestionnaire de tampon => taux de présence dans le cache des tampons) et je tourne à environ entre 80% et 90%. Donc autant dire que c'est assez mauvais.
    J'exclue le rajout de RAM car j'ai en permanence 1,5Gb de libre (comme dit plus haut). Les versions sont:

    OS : Windows Server 2003 standart edition
    SQL : SQL Server 2000 standart edition SP4

    Est-ce que, avec ces versions, je peux activer la gestion AWE ? Que faire exactement à part modifier le 'awe enabled' dans SQL Server ? Dois-je aussi modifier les paramètres (/3GB) dans le boot.ini ?

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 994
    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 994
    Billets dans le blog
    6
    Par défaut
    80% et 90%. de cache hit ratio, c'est effectivement exécrable.

    80% de cache hit ratio signifie que 80 % des données sont en cache et 20% sont lues sur le disque.
    Sachant que la différence de vitesse entre une lecture mémoire et une lecture disque est de 1000 (au moins), cela signifie que si le temps moyen d'une requête "mémoire" est de 1 ms alors il y a 80 requêtes qui prennent 1ms et 20 requêtes qui prennent 1 seconde, soit au total une moyenne de 20,08 seconde soit 20.08/100 = 0,2 seconde en moyenne
    à 90% le temps global est de 10,09 seconde soit en moyenne 0,1009 seconde
    à 99% le temps moyen est de 0,01099
    Autrement dit entre 80% et 99% le rapport est de 18,2

    Cela sigifie que votre base de données tourne environ 20 fois moins rapidement que si elle était à 99%

    OS : Windows Server 2003 standard edition => limité à 4 Go de RAM. Donc migration à prévoir vers une version advanced.

    Effectivement le seul moyen rapide est d'augmenter la mémoire.... Faites attention de voir si le serveur (PC, machine physique) le permet. Ce n'est pas toujours le cas.

    Ensuite le second moyen est de réduire la fenêtre des données. C'est souvent plus payant, mais beaucoup plus ciomplexe car cela signifie d'auditer globalement le serveur sur tous les plans y compris modèle de données, écriture des requêtes et proc stoc, indexation... etc. Le but étant de réduire drastiquement la fenêtre de données.

    Pour cela lisez l'article 1/5 que j'ai écrit sur l'optimisation :
    http://www.sqlspot.com/Voulez-vous-optimiser-votre.html

    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/ * * * * *

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

Discussions similaires

  1. [SQL SERVER 2005] Exporter une table en Access
    Par Golzinne dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/03/2007, 17h08
  2. [SQL SERVER 2005] Ouvrir une table en exclusif
    Par olbi dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 02/03/2007, 18h58
  3. [SQL Server] Filtré sur une table avant une jointure externe
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/11/2006, 15h52
  4. [SQL Server 2000] Verrouiller une table
    Par Matth_S dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/10/2006, 14h34
  5. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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