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 :

Forcer la Mise en cache d'une requête


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 84
    Points
    84
    Par défaut Forcer la Mise en cache d'une requête
    Bonjour,

    Toujours dans le cadre de l'optimization :
    Quand on fait une requête ça prend un temps X
    et quand on refait la même requête c'est beaucoup plus rapide.
    Et cela vient du fait que SQL Server met la requête dans le cache.

    Dans le cadre d'une grosse requête, qui retourne beaucoup de résultats, comment puis-je forcer la mise en cache ?

    Déjà est-ce que c'est possible ?
    Ou bien lui faire faire une requête dans le vide avec un TOP 1 par exemple ....

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    Dans le cadre d'une grosse requête, qui retourne beaucoup de résultats, comment puis-je forcer la mise en cache ?
    Seul le plan d'exécution est mis en cache, pas les résultats...
    Schématiquement, toute requête executée est mise en "query cache" pour lui associer un plan d'exécuution.
    A l'exécution, les pages lues sont montées dans le buffer cache et à la deuxième exécution les données sont déjà en mémoire donc le temps est plus court.
    Donc si votre requête retourne des millions de lignes, il n'y a grand chose à faire à ce niveau là. Il faut surtout regarder le plan d'exécution de cette requête pour voir si des index sont utilisés pour limiter le coût en I/O, l'indicateur principal de performance d'une requête.
    Emmanuel T.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    si on mettait en cache les données a quoi servirait-il d'avoir une BDD car le cache est parfois suffisant "pour se faire une idée" du type google, mais lorsque l'on demande des infos a une base on veut des données "a jour".

    le fait que plus tu exécutes ta requête, plus elle va vite (surtout vrai sous Oracle) vient du fait des statistics et de ce que t'as dis kagemaru; entre la première et la deuxième exécution, en plus, il y a le temps de compilation en moins
    Errare humanum est, perseverare diabolicum (Sénèque)

  4. #4
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 84
    Points
    84
    Par défaut
    En fait, c'est presque ça :

    Understanding Results Caching

    After the Query Processor executes a query, it returns to the client the data that resulted from query execution. If Liquid Data results caching is enabled, the first time a query is run, Liquid Data saves its results into a query results cache. The next time the query is run with the same parameters, Liquid Data checks the cache configuration and, if the results have not expired, quickly retrieves the results from the cache rather than re-running the query. In this way, for queries that are executed repeatedly with the same parameters, using the results query cache reduces processing time and enhances overall system performance.
    Cela signifie bien que lorsqu'une requête est établie, on l'exécute et ça met un certain temps. Ensuite, elle est mise dans le cache.
    Si on la ré-exécute, on va d'abord regarder si c'est la même et que les données n'ont pas changées ! Et alors à ce moment là que l'on gagne du temps !!
    Car une requête renvoie toujours les données à jour.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    il aurait alors fallu préciser que vous utilisez le produit Liquid Data, ce qui est un cache supplémentaire par rapport à la base de données ...
    Emmanuel T.

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 127
    Points : 84
    Points
    84
    Par défaut
    en fait nan, j'utilise pas Liquid Data ...
    J'ai juste trouvé ça sur le net en tapant des bons mots clés sur Google !!
    J'utilise SQL Server 2005.

    C'est quoi Liquid Data ???

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    SQL Server possède un cache de données (les lignes des tables :en fait des pages de données) et un cache des procédures.
    Toute requête est mise en cache avec son plan associé.
    Toute données nécessaire à toute requête est aussi mis en cache...

    Le problème est que la cache n'est pas extensible à l'infini puisque c'est la RAM !

    Ce qui se passe est simple : les entrées du cache les moins utilisées (données et procédures) sont celles qui dégagent les premières lorsqu'il n'y a plus assez de RAM pour tout mettre en cache.

    De ce fait si vous jouez une requête pour la première fois sur une table rarement utilisée les données vont monter en cache (requête à froid) . Si une 2e exécution a lieu juste après, alors les données et le plan de requête étant en cache cela va aller très vite (requête à chaud).
    Petit à petit au fur et à mesure de l'utilisation du SGBDR les pages de données de cette table vont disparaître pour laisser place à des nouvelles données nécessaires à d'autres requêtes.

    Pour de plus amples informations lisez la série d'articles que j'ai écrit à ce sujet pour SQL Server magazine :
    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. Forcer la Mise en cache d'une requête
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 18/01/2008, 22h40
  2. forcer la mise en cache de 2 sous-requetes
    Par ashtur dans le forum Oracle
    Réponses: 9
    Dernier message: 27/06/2007, 18h00
  3. Mémoriser une mise en page d'une requête
    Par floadd dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/09/2006, 09h40
  4. [HTML] Pas de mise en cache pour une playlist xml d'un swf
    Par Lock622 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 13/08/2006, 15h49
  5. Mise en cache d'une page
    Par clad523 dans le forum ASP
    Réponses: 1
    Dernier message: 06/03/2006, 11h44

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