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

Surveillance de SQL Server TempDB à l'aide de vues de gestion dynamiques (DMV)

Qu'est-ce que TempDB dans MS SQL Server ?

TempDB est une base de données système dans Microsoft SQL Server utilisée comme magasin d'objets internes, de versions de ligne, de tables de travail, de tables temporaires et d'index. TempDB est disponible pour tous les participants connectés à une instance SQL Server (il s'agit d'une ressource globale). Pour ceux qui connaissent d'autres saveurs de base de données, la base de données tempDB est similaire à l'espace de table TEMP dans Oracle. Pour le dire gentiment, tout ce qui ne peut pas tenir dans la mémoire de votre instance déborde sur les fichiers de données tempdb.

TempDB est généralement utilisé dans les cas suivants :

  1. Les tables temporaires sont créées avec la convention de dénomination #. J'ai vu une ou deux applications dans ma boutique qui créent beaucoup de ces conventions. Par conséquent, cela peut affecter les performances. Pour chaque table temporaire, TempDB distribue des pages dont la taille dépend de la taille de la table. De plus, il peut y avoir des conflits si plusieurs sessions simultanées créent ces TempTables simultanément.
  2. Le niveau d'isolement READ_COMMITTED_SNAPSHOT est activé. Nous avons dû le faire sur deux de nos instances il y a quelques années car il y avait deux applications qui connaissaient un nombre important de blocages. L'utilisation des niveaux d'isolement d'instantané est un moyen de gérer les blocages, en particulier si vous ne souhaitez pas faire des allers-retours avec les développeurs sur le codage approprié. Vous devez savoir que cela devrait contribuer à améliorer les performances. Cependant, il utilise un contrôle de concurrence optimiste qui peut ne pas être souhaitable dans tous les cas en ce qui concerne l'intégrité des données.
  3. Les index sont construits ou reconstruits avec l'option SORT_IN_TEMPDB=ON. Il tend à supprimer la charge de tri de la base de données qui possède l'index pendant que le processus de reconstruction est en cours. Il peut être utile d'examiner l'impact total de cette option sur les performances de l'instance dans son ensemble.
  4. La fonctionnalité MARS (Multiple Active Result Sets) est activée. Non, MARS n'est pas une planète dans ce scénario, c'est une fonctionnalité qui permet à une application de soumettre plusieurs lots via une seule connexion. Il est désactivé par défaut et peut être explicitement activé en incluant MultipleActiveResultSets=True dans une chaîne de connexion.
  5. En interne, SQL Server a également utilisé TempDB pour créer des tables de travail couramment utilisées dans les opérations de curseur :appels par les clauses GROUP BY, ORDER BY ou UNION. Les tables de travail peuvent être considérées comme des tables temporaires créées par l'activité du moteur SQL Server plutôt que par une activité utilisateur directement.

Vues de gestion dynamique pertinentes SQL Server

Les vues de gestion dynamique (DMV) suivantes sont utiles pour enquêter sur l'activité dans TempDB :

  1. sys.dm_db_file_space_usage :Ce DMV renvoie des informations sur l'utilisation de l'espace des fichiers dans les bases de données qui vous intéressent. Il peut être utilisé pour examiner n'importe quelle base de données de l'instance et la sortie ne concerne que cette base de données. Dans le contexte de cet article, nous utiliserons le DMV pour examiner TempDB.
  2. sys.dm_db_session_space_usage :Ce DMV est exclusif à la base de données TempDB et renvoie le nombre de pages allouées et désallouées par chaque session pour une base de données donnée. Les attributions de pages sont généralement conservées jusqu'à la fin de la session.
  3. sys.dm_db_task_space_usage  :Cette DMV est également exclusive à la base de données TempDB et fournit des informations sur le nombre de pages allouées et désallouées par chaque tâche pour une base de données donnée.
  4. sys.dm_tran_active_snapshot_database_transactions :Ce DMV renvoie les transactions actives qui génèrent et peuvent accéder aux versions de ligne. Cette vue est pertinente lorsque des options telles que ALLOW_SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT sont activées.
  5. sys.dm_tran_version_store :Ce DMV fournit des informations sur tous les enregistrements de version dans le magasin de versions. Dans un serveur de production actif, les enregistrements de cette table peuvent augmenter de manière significative. Ainsi, nous devons être prudents lors de l'interrogation du DMV.

Examen des commandes DMV avant de travailler avec la base de données TempDB

sys.dm_file_space_usage

Nous pouvons obtenir des descriptions de ces DMV à partir de la documentation Microsoft.

Le tableau 1 montre la description de sys.dm_file_space_usage . La requête du Listing 1 affiche respectivement l'utilisation de l'espace fichier pour les bases de données TempDB et WideWorldImporters. Les images 1 et 2 renvoient les résultats de cette requête avec les bases de données TempDB et WideWorldImporters respectivement.

[identifiant de table=44 /]

Tableau 1 :description de sys.dm_file_space_usage

-- List 1: Check space usage on database files
-- Check space usage on tempdb
use tempdb
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;
-- Check space usage on WideWorldImporters
use WideWorldImporters
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;

Fig. 2 Sortie de la requête sur sys.dm_file_space_usage (WideWorldImporters)

Notez que la colonne total_page_count indique la taille exacte du fichier de base de données en question. De plus, les types de fichiers LOG et FILESTREAM ne sont pas affichés. De plus, comme prévu, allocated_extent_page_count correspond à l'espace utilisé dans le fichier de données WWI_UserData.

Fig. 3 Tailles de fichier sur la base de données WideWorldImporters

sys.dm_db_session_space_usage

Le tableau 2 montre l'utilisation de la DMV sys.dm_db_session_space_usage. Le listing 2 est le résultat de la requête. Notez que le nombre de lignes renvoyées correspond au nombre actuel de sessions (actives ou inactives) dans l'instance. Rappelez-vous également que ce DMV concerne UNIQUEMENT TempDB.

[identifiant de table=45 /]

Tableau 2 :description de sys.dm_db_session_space_usage

-- Listing 2: Check space allocation per session in the instance
-- Applies on to tempdb database
select
session_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_session_space_usage;
select count(*) from sys.dm_exec_sessions;

sys.dm_db_task_space_usage

Le tableau 3 montre l'implémentation de la DMV sys.dm_db_task_space_usage. Le Listing 3 affiche sa sortie.

[identifiant de table=46 /]

Tableau 3 :description de sys.dm_db_task_space_usage

-- List 3: Check space allocation per task int the instance
-- Applies on to tempdb database
select
task_address
,is_remote_task
,session_id
,request_id
,exec_context_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_task_space_usage;

Autres requêtes DMV dans MSSQL TempDB

Les deux autres DMV semblent être vides avant l'exécution de toute activité de base de données. Les tableaux 4 et 5 présentent une description des deux tableaux. Dans la section suivante, nous examinerons comment les données des DMV changent lorsque nous générons une activité de base de données.

[identifiant de table=47 /]

Tableau 4 :description de sys.dm_tran_active_snapshot_database_transactions

[identifiant de table=48 /]

Tableau 5 :description de sys.dm_tran_version_store

Examiner le DMV une fois l'activité de la base de données terminée

Générons de l'activité.

Pour cela, lancez les requêtes simples du listing 4.

-- Listing 4
-- Query 1
use WideWorldImporters
go
select * from
[Sales].[Invoices];
-- Query 2
use WideWorldImporters
go
select * from
[Sales].[Invoices]
order by ContactPersonID;

Comme vous pouvez le voir, il n'y a pas d'allocations ou de désallocations significatives à partir de cette petite requête, nous élevons donc la barre en créant une table temporaire à l'aide du script du Listing 5.

-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];

Nous obtenons maintenant un nombre important de pages allouées et réservées pour notre session active 62 (voir Fig. 8). Faites également attention au nombre important d'extensions allouées et de pages réservées affichées dans sys.dm_db_file_space_usage (Fig. 9).

Lorsque nous allons de l'avant et supprimons le Temptable #Invoice, nous voyons que les pages allouées dans TempDB sont libérées comme illustré à la Fig. 12. Cependant, la sortie du DMV dm_db_session_space_usage indique toujours que certaines pages sont allouées à la session. Nous voyons que cela est publié dès que nous fermons la session (ID de session 62).

Ensuite, nous ouvrons une autre session et créons un index en utilisant les requêtes du Listing 6. Dans la requête 1 excluant l'option SORT_IN_TEMPDB et dans la requête 2, nous utilisons cette option après avoir supprimé l'index. Aucune allocation significative ne se produit pour le premier cas, mais nous constatons quelques changements lors de l'utilisation de SORT_IN_TEMPDB. Ce changement est très faible compte tenu de la taille de l'index en question (voir Fig. 16 et 17).

Nous effectuerons le test final. Nous découvrons que jusqu'à présent, les DMV tels que sys.dm_tran_active_snapshot_database_transactions et sys.dm_tran_version_store ne renvoient aucune ligne lorsqu'ils sont interrogés.

Activons les niveaux d'isolement SNAPSHOT_ISOLATION et READ_COMMITTED_SNAPSHOT (Liste 7). Une fois cela fait, une seule instruction de mise à jour crée un enregistrement dans le DMV sys.dm_tran_version_store. Mettre cette même requête est une transaction que nous utilisons pour voir qu'un enregistrement est également généré dans le sys.dm_tran_active_snapshot_database_transactions pendant la transaction.

-- Listing 7
ALTER DATABASE WideWorldImporters
SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE WideWorldImporters
SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8
-- Query 1
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
-- Query 2
-- Transaction
BEGIN TRAN
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
 WAITFOR DELAY '00:00:30';
COMMIT TRAN;
GO

Conclusion

Nous avons brièvement exploré que nous pouvons surveiller l'activité de TempDB à l'aide de cinq clés DMV exposées par SQL Server. Lorsque vous utilisez ce niveau du processus de surveillance dans un environnement de production, nous pouvons déterminer si nous avons besoin de plus d'espace dans TempDB et les fichiers de données. De plus, nous pouvons analyser l'impact de l'isolation SNAPSHOT si nous avons déjà activé cette fonctionnalité.

Les données de sortie de ces DMV pourraient également être utiles pour montrer clairement aux développeurs d'applications l'impact de leur comportement de code sur tempDB et l'instance dans son ensemble. Dans l'ensemble, il est assez gratifiant de comprendre l'utilisation de ces DMV en tant que DBA soucieux de la performance et de la gestion de l'espace.

Références

Isolation d'instantané dans SQL Server
Utilisation de plusieurs ensembles de résultats actifs
Description de sys.dm_tran_version_store
Description de sys.dm_db_task_space_usage
Description de sys.dm_file_space_usage
Description de sys.dm_db_session_space_usage
Description de sys.dm_tran_active_snapshot_database_transactions