Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Question sur le cache SQL Server

Lorsque vous effectuez votre requête, les données sont lues en mémoire par blocs. Ces blocs restent en mémoire mais ils "vieillissent". Cela signifie que les blocs sont marqués avec le dernier accès et lorsque Sql Server nécessite un autre bloc pour une nouvelle requête et que le cache mémoire est plein, le bloc le moins récemment utilisé (le plus ancien) est expulsé de la mémoire. (Dans la plupart des cas, les blocs d'analyse de tables complètes sont instantanément vieillis pour éviter que les analyses de table complètes ne surchargent la mémoire et n'étouffent le serveur).

Ce qui se passe ici, c'est que les blocs de données en mémoire de la première requête n'ont pas encore été expulsés de la mémoire et peuvent donc être utilisés pour votre deuxième requête, ce qui signifie que l'accès au disque est évité et que les performances sont améliorées.

Donc, ce que votre question demande vraiment, c'est "puis-je obtenir les blocs de données dont j'ai besoin en mémoire sans les lire en mémoire (en faisant une requête)?". La réponse est non, sauf si vous souhaitez mettre en cache les tables entières et les faire résider en mémoire en permanence, ce qui, à partir du moment de la requête (et donc de la taille des données) que vous décrivez, n'est probablement pas une bonne idée.

Votre meilleur pari pour l'amélioration des performances consiste à examiner vos plans d'exécution de requêtes et à déterminer si la modification de vos index peut donner un meilleur résultat. Deux domaines principaux peuvent améliorer les performances :

  • créer un index où la requête pourrait en utiliser un pour éviter les requêtes inefficaces et les analyses de table complètes
  • ajouter plus de colonnes à un index pour éviter une deuxième lecture de disque. Par exemple, vous avez une requête qui renvoie les colonnes A et B avec une clause where sur A et C et vous avez un index sur la colonne A. Votre requête utilisera l'index de la colonne A nécessitant une lecture sur un disque mais nécessitant ensuite un deuxième disque hit pour obtenir les colonnes B et C. Si l'index contient toutes les colonnes A, B et C, le deuxième hit disque pour obtenir les données peut être évité.