J'ai un site Web ASP.NET qui fait sa propre mise en cache indépendante des données et les données ne changent pas pendant de longues périodes, il n'a donc pas besoin d'interroger SQL Server une deuxième fois avec la même requête. J'ai besoin d'améliorer les performances des premières requêtes (vierges) qui vont à ce serveur SQL. Certaines requêtes traitent tellement de données qu'elles peuvent entraîner l'utilisation de SQL Server tempdb
. Je n'utilise pas de variables de table temporaire ou de tables temporaires, donc SQL Server décide de l'utiliser tempdb
seul quand il en a besoin.
Ma taille de base de données est de 16 Go, j'ai 32 Go de RAM physique disponible sur ma machine serveur.
Je comprends que la stratégie de mise en cache de MS SQL Server essaie de conserver les données dans la RAM pour accélérer les performances de requêtes similaires si elles ont besoin de charger les mêmes données à nouveau. De plus, il essaiera d'utiliser la RAM disponible au lieu de tempdb pour accélérer les performances sans provoquer d'accès au disque.
Je suppose que lorsqu'une requête qui doit stocker quelque chose dans tempdb SQL Server arrive et qu'il n'y a pas assez de RAM disponible, SQL Server a 2 choix:
1) pour décharger certaines données mises en cache et utiliser de la RAM épargnée au lieu de tempdb pour éviter les écritures sur disque
2) conserver les données en cache pour les requêtes futures et commencer à utiliser tempdb, ce qui ralentit les écritures sur le disque.
Je ne sais pas quel choix SQL Server fera dans cette situation, mais je voudrais qu'il fasse le choix n ° 1 car je ne me soucie que des performances des premières requêtes (vierges), car je n'envoie plus jamais la même requête à SQL Server (même si je peux envoyer une requête similaire).
Quelle est la stratégie de mise en cache SQL Server pour ce scénario?
Comment équilibre-t-il l'utilisation de la RAM entre l'évitement de tempdb pour les requêtes vierges et la vitesse des secondes requêtes?
Est-il possible de configurer SQL Server de telle manière qu'il fera le choix n ° 1? Si oui, alors comment?
Sinon, comment puis-je augmenter les performances de toutes les requêtes SQL vierges?
Étant donné que je ne connais pas la stratégie de mise en cache de SQL Server, je souhaite placer la base de données sur le disque RAM. Cela garantira que toute requête vierge a une vitesse de chargement élevée des données non mises en cache même si SQL Server fait toujours le choix n ° 1. Le risque est que SQL Server puisse commencer à utiliser plus de tempdb avec moins de RAM disponible (il ne reste que 16 Go après avoir utilisé 16 Go pour le disque RAM) s'il continue de faire le choix # 2, ce qui ralentira les requêtes vierges qui provoquent des déversements tempdb
.
Je suis intéressé par la solution pour SQL 2008 R2, mais je suppose que c'est probablement la même chose pour SQL 2008, SQL 2005 et peut-être SQL 2000.
Clarifications:
Il n'y a aucune autre application en cours d'exécution sur cette boîte, elle est dédiée à SQL Server . Le site Web fonctionne sur une boîte séparée.
Il s'agit de SQL Server 2008 R2 Standard Edition 64 bits sur Windows Server 2008 R2 Enterprise 64 bits.
J'exécute uniquement les requêtes en lecture seule et la base de données est définie en lecture seule .
Supposons qu'il existe déjà de bons index . Cette question concerne SQL Server faisant le choix n ° 1 par rapport au choix n ° 2, comment le fait-il, s'il existe un moyen de le contrôler et si le disque RAM l'aide à faire le bon choix pour les requêtes vierges.