web-dev-qa-db-fra.com

Comportement SQL Server TEMPDB dans un environnement de mémoire grand

Lecture sur cette question m'a rappelé une question que j'avais il y a un moment.

Nous avons un serveur SQL qui dispose de 512 Go de RAM, la base de données principale est de 450 Go. Nous voyons beaucoup d'action dans TEMPDB (OK, je pense que c'est "beaucoup d'action" - ce n'est peut-être pas!). J'ai installé une version de démonstration de Ramdisk Plus Server, a créé une RamDrive de 50 Go, pointue Tempdo, et n'a vu aucune amélioration de la performance du tout.

Les écrivies sur TEMPDB entraînent toujours une écriture physique réelle sur le disque, ou Tempdb écrit-il en cache de SQL Server pour écrire différé comme dans le cache du système de fichiers Windows?

Un ramdisk est-il inutile dans ce scénario?

Je sais que SQL Server 6.5 avait pris en charge TEMPDB-IN-RAM, mais je vois que cela a été interrompu il y a longtemps!

12
Max Vernon

Les écrivies sur TEMPDB entraînent toujours une écriture physique réelle sur le disque, ou Tempdb écrit-il en cache de SQL Server pour écrire différé comme dans le cache du système de fichiers Windows?

Est-ce qu'ils sont toujours? Très certainement pas. Est-ce qu'ils sont-ils jamais? Oui mais pas à la suite du mécanisme typique. Référence ici est Que fait le point de contrôle pour Tempdb? .

Dans un système "bien élevé", écrit à un fichier de base de données utilisateur se produit sur le point de contrôle. Dans un système mal élevé, les écritures se produiront également lorsque la fablrector doit affleurer des pages de la piscine tampon pour faire de la place pour d'autres pages.

Un point de contrôle n'est effectué que pour tempdb lorsque le fichier journal TEMPDB atteint 70% complet - il s'agit d'empêcher le journal TEMPDB de grandir si possible (notez qu'une transaction à long terme peut toujours contenir essentiellement l'otage de la bûche et l'empêcher de dégager. , comme dans une base de données d'utilisateurs).

Mais il n'est pas nécessaire de chasser TEMPDB sur le disque, car la récupération de crash n'est jamais exécutée sur TEMPDB, elle est toujours recréée au démarrage.

TEMPDB n'est pas récupéré en cas de crash, et il n'est donc pas nécessaire de forcer les pages de TEMPDB sales sur le disque, sauf dans le cas où le processus de lazywriter (une partie du pool tampon) doit faire de la place à des pages d'autres bases de données.

Cela remarquablement (c'était une surprise pour moi) est le seul mécanisme par lequel les pages Tempdb seront écrites sur le disque. S'il y a une pression de piscine tampon, les pages TEMPDB peuvent être rinçues sur le disque. S'il n'y a pas, cela ne devrait pas se produire.

EDIT: DISPABLABLE Si "mal élevé" est une description appropriée pour une base de données d'utilisateurs qui rédige des pages en dehors du point de contrôle. Inhabituel, atypique ou tout simplement pas idéal peut-être?

Édition supplémentaire (Commentaires suivants/Chat avec @Paulwhite):

L'omission étincelle ci-dessus est que les tables temporaires ne sont pas une seule source de trafic tempdb. Citant de Comprendre les événements de débordement de hachage, de tri et d'échange :

Certaines opérations d'exécution de la requête SQL Server sont calibrées pour effectuer de mieux en utilisant une quantité de mémoire (un peu) en tant que stockage intermédiaire. L'optimiseur de requêtes choisira un plan et estimera le coût en fonction de ces opérateurs à l'aide de cette mémoire de gratter. Mais c'est bien sûr seulement une estimation. Lors de l'exécution, les estimations peuvent se révéler fausses et le plan doit continuer en dépit de ne pas avoir assez de mémoire. Dans un tel événement, ces opérateurs se répandent sur le disque.

J'avais supposé à tort que le mécanisme derrière une écriture physique pour une opération de déversement était exactement le même que décrit précédemment, lazewriter forçant les pages Tempdb sur le disque à la suite d'une pression sur le pool tampon (causée par le déversement).

@Paulwhite a expliqué où j'avais tort (merci Paul!):

Je pense que vous demandez pourquoi l'activité physique tempdb survient lorsqu'une requête dépasse sa subvention de mémoire d'espace de travail, plutôt que de simplement utiliser Tempdb-in-mémoire s'il l'a fait, la requête utiliserait plus de mémoire que sa subvention, vaincre le point de restreindre la mémoire subventions en premier lieu.

Les déversements sont en effet spéciaux par écrit au stockage. L'activité physique tempdb est vue sur un déversement, même face à des oodules de mémoire libre et de la pression zéro sur TEMPDB.

Paul m'a également dirigé vers son article de blog TUNING TSQL avancé: Pourquoi la connaissance des internaux compte qui comprend des scripts d'exemple pour démontrer des déversements, pour ceux qui souhaitent plonger plus profondément.

19
Mark Storey-Smith