Contexte
Je suis en train de migrer une base de données de 160 Go à partir de MSSQL 2008 (standard) sur un serveur Win 2008 avec 48 Go RAM vers un nouveau serveur exécutant MSSQL 2012 (édition Web 64 bits) sur Win 2012 avec 64 Go de RAM. L'ancien serveur est sous tension et en charge; le nouveau serveur n'est pas en production. Le nouveau serveur a 8 fichiers tempdb (4 Go chacun).
Problème
Lors des tests sur le nouveau serveur, je constate que les étapes de nombreuses requêtes provoquent des alertes mentionnant "l'opérateur a utilisé tempdb pour renverser les données pendant l'exécution". J'ai pu éviter les tris en réécrivant certaines des requêtes, mais cela ne résout pas vraiment le problème. Les mêmes requêtes sur l'ancien serveur ne provoquent pas de déversements. J'ai lu que les déversements se produisent lorsque MSSQL ne peut pas terminer une opération en mémoire et doit se déverser/page dans tempdb. Dois-je m'inquiéter des déversements?
Exemples
J'ai exécuté sp_updatestats sur la base de données, donc les statistiques doivent être à jour, mais vous remarquerez qu'il existe des écarts entre le nombre estimé et réel de lignes.
Problème de mémoire
J'ai défini un paramètre de mémoire maximale pour MSSQL de 58 sur 64 Go. Actuellement, MSSQL a consommé environ 35 Go de cette mémoire, mais dispose d'un ensemble fonctionnel de seulement 682 Mo. L'ancien serveur (bien qu'en production, en charge de la charge) dispose de 44 Go de mémoire dédiée à MSSQL dont 43,5 Go dans son jeu de travail.
Je ne sais pas si les déversements pourraient être liés à un paramètre de mémoire - quelqu'un a-t-il des idées? MSSQL a actuellement des hectares de RAM à revendre, alors pourquoi se répand-il dans tempdb pour certaines sortes et correspondances de hachage?
Il y a plusieurs questions différentes ici:
Q: Pourquoi les requêtes ne se sont-elles pas répandues auparavant?
Ils l'étaient, mais SQL Server Management Studio n'a pas révélé cela comme une erreur claire avant SQL 2012. C'est un excellent exemple de la raison pour laquelle lorsque vous effectuez un réglage des performances, vous devez aller plus loin que le plan d'exécution graphique.
Q: Pourquoi les requêtes se déversent-elles sur le disque?
Parce que SQL Server ne leur a pas accordé suffisamment de mémoire pour terminer leurs opérations. Peut-être que le plan d'exécution a sous-estimé la quantité de mémoire requise, ou peut-être que la boîte est sous pression de mémoire, ou ce ne sont que de grosses requêtes. (N'oubliez pas, SQL Server utilise la mémoire pour trois choses: la mise en cache des pages de données brutes, la mise en cache des plans d'exécution et l'espace de travail pour les requêtes. Cette mémoire de l'espace de travail finit par être assez petite.)
Q: Comment puis-je réduire les déversements?
En écrivant des instructions T-SQL discutables, en ayant des statistiques à jour, en mettant suffisamment de mémoire sur le serveur, en construisant les bons index et en interprétant les plans d'exécution lorsque les choses ne se déroulent pas comme prévu. Consultez livre de Grant Fritchey SQL Server Query Performance Tuning pour des explications détaillées sur tous ces éléments.