web-dev-qa-db-fra.com

SQL Server 2016 avec utilisation haute tempdb et faible RAM Utilisation

J'ai une petite instance de SQL Server Standard que je manipule les repères HoundDB TPC-H (1 Go) sur. Il a un problème de configuration si où il écrit tout dans tempdb sur disque, et seulement tempdb qui semble être goutiqué moi car mon stockage physique est assez lent:

tempDB

La base de données par elle-même est d'environ 3,5 Go et le serveur a 16 Go de RAM.

Ma compréhension est que tempdb est utilisé uniquement lorsque le serveur est sous pression de la mémoire, mais il n'arrive même jamais à 30% d'utilisation. Physical_memory_in_use_kb n'est jamais beaucoup plus de 3 Go, même si cela augmente régulièrement au fil du temps. L'hôte VMware n'a aucun problème évident non plus.

sp_blitz Les résultats avertissent d'une utilisation élevée de la CPU (environ 75 à 85%) et peu importe d'autres.

Ceci est une installation presque par défaut de SQL Server Standard dans un cluster - est ce comportement d'écriture à tempdb normal dans le cas de ces requêtes de référence plus longues? Sinon, où puis-je commencer le dépannage?

En réponse aux commentaires:

3
user19702

Je crois comprendre que Tempdb n'est utilisé que lorsque le serveur est sous pression de mémoire.

Ce n'est pas Exactement vrai. Il y a beaucoup de choses qui peuvent causer une utilisation tempdb:

  • le plus évident écrit explicitement des données sur des tables temporaires locales ou mondiales (#tempTableName ou alors ##tempTableName). J'imagine que ce n'est pas votre problème cependant
  • activité de magasin de version (par exemple en raison de requêtes à l'aide d'une isolation instantanée ou de RCSI)
  • il y a quelques opérateurs de plan d'exécution qui peuvent "renversement" à tempdb

Il est probable que votre problème soit des déversements. Pour de bonnes informations générales, et des liens vers des étapes de dépannage spécifiques, consultez cette réponse de Paul White à la question Quelle fréquence des renversements Hash/Trier dans TEMPDB est concernant?

Vous pouvez également courir sp_BlitzCache @SortOrder = 'spills' (à partir du kit de premier intervenant ) pour trouver certaines des requêtes les plus problématiques si elles sont toujours dans votre cache de plan.

En ce qui concerne les déversements, vous pouvez poster des questions distinctes sur les mauvaises requêtes et probablement obtenir de l'aide pour résoudre tout ce qui est causant les déversements (mauvaises estimations de cardinalité, petites subventions de mémoire, etc.).

La pression de la mémoire peut entraîner des subventions de mémoire faible, ce qui peut conduire à des déversements tempdb - c'est pourquoi j'ai dit que votre assertion initiale sur la pression de la mémoire n'est pas exactement vraie - car c'est vrai parfois !


Le plan d'exécution que vous avez fourni est un plan d'exécution estimé. Il n'indique donc pas si des opérateurs renversés à TEMPDB. Mais il dispose de plusieurs opérateurs consommateurs de la mémoire (tresse en particulier), il est donc possible de générer une activité TEMPDB.

2
Josh Darnell