85
4.3 tempdb
4.3 TEMPDB
tempdb est la base de données système qui recueille tous les objets temporaires créés
dans SQL Server. Elle est détruite et reconstruite à chaque démarrage de l’instance
SQL, à partir de la base de données model, tout comme les bases utilisateurs. Si vous
voulez changer une option de tempdb, ou sa taille initiale, vous pouvez modifier ces
options dans model. tempdb est en mode de récupération simple. Cela ne peut être
changé, et il n’y a aucune raison de vouloir mettre tempdb dans un mode complet.
tempdb contient non seulement les objets temporaires (tables, procédures, clés de
chiffrement, etc.) créés avec les préfixes # ou ##, et les variables de type table, mais
vous pouvez également y créer des objets « persistants », comme dans n’importe
quelle base de données. Ces objets y seront conservés jusqu’à leur suppression
manuelle par un DROP, ou jusqu’au prochain redémarrage de l’instance.
Outre les objets temporaires, tempdb recueille aussi deux autres types de
structures : des dépôts de version (version stores) pour des lignes impliquées dans du
suivi de version (row versioning, voir section 4.2.1), et des objets internes (internal
objects). Le row versioning est utilisé pour quelques fonctionnalités comme le niveau
d’isolation SNAPSHOT, les pseudo-tables de déclencheurs, MARS (Multiple Active
Result Sets), la génération d’index ONLINE et certaines commandes DBCC comme
CHECKDB.
Les objets internes permettent de stocker des données intermédiaires pour tous
types d’opérations SQL Server (plans de requête, variables LOB ou XML, résultats
de curseurs, messages Service Broker en transit, etc.).
Les objets internes et les dépôts de versions ne sont pas inscrits dans le journal de
transaction de tempdb. Ils sont optimisés autant que faire se peut.
Vous trouverez plus de détails sur leur stockage interne dans le livre blanc
« Working with tempdb in SQL Server 2005 » (http://www.microsoft.com/technet/
prodtechnol/sql/2005/workingwithtempdb.mspx).
Les objets utilisateurs (tables temporaires, fonctions table et variables de type
table) génèrent, eux, des écritures dans le journal de transactions.
Au fil des versions de SQL Server, tempdb apporte de plus en plus d’optimisations,
dans la façon de gérer la journalisation des transactions, l’allocation et la libération
des objets. C’est un problème critique, car tempdb subit une grande quantité de créations et destructions d’objets, contrairement à une base de données utilisateur, qui
ne subit en utilisation normale que très peu de modifications d’objets. Ainsi, lorsque
tempdb est très sollicité, à cause par exemple d’une forte utilisation de tables temporaires dans le code SQL, il peut se produire une contention sur les structures du
fichier de données de tempdb (due aux allocations et libérations de pages et d’extensions pour gérer le contenu), ou sur les tables de métadonnées (due à un grand nombre de créations ou de suppressions d’objets). Ce risque de contention est diminué
par différentes méthodes (diminution du verrouillage des structures de données, ges-
4.3 tempdb
4.3 TEMPDB
tempdb est la base de données système qui recueille tous les objets temporaires créés
dans SQL Server. Elle est détruite et reconstruite à chaque démarrage de l’instance
SQL, à partir de la base de données model, tout comme les bases utilisateurs. Si vous
voulez changer une option de tempdb, ou sa taille initiale, vous pouvez modifier ces
options dans model. tempdb est en mode de récupération simple. Cela ne peut être
changé, et il n’y a aucune raison de vouloir mettre tempdb dans un mode complet.
tempdb contient non seulement les objets temporaires (tables, procédures, clés de
chiffrement, etc.) créés avec les préfixes # ou ##, et les variables de type table, mais
vous pouvez également y créer des objets « persistants », comme dans n’importe
quelle base de données. Ces objets y seront conservés jusqu’à leur suppression
manuelle par un DROP, ou jusqu’au prochain redémarrage de l’instance.
Outre les objets temporaires, tempdb recueille aussi deux autres types de
structures : des dépôts de version (version stores) pour des lignes impliquées dans du
suivi de version (row versioning, voir section 4.2.1), et des objets internes (internal
objects). Le row versioning est utilisé pour quelques fonctionnalités comme le niveau
d’isolation SNAPSHOT, les pseudo-tables de déclencheurs, MARS (Multiple Active
Result Sets), la génération d’index ONLINE et certaines commandes DBCC comme
CHECKDB.
Les objets internes permettent de stocker des données intermédiaires pour tous
types d’opérations SQL Server (plans de requête, variables LOB ou XML, résultats
de curseurs, messages Service Broker en transit, etc.).
Les objets internes et les dépôts de versions ne sont pas inscrits dans le journal de
transaction de tempdb. Ils sont optimisés autant que faire se peut.
Vous trouverez plus de détails sur leur stockage interne dans le livre blanc
« Working with tempdb in SQL Server 2005 » (http://www.microsoft.com/technet/
prodtechnol/sql/2005/workingwithtempdb.mspx).
Les objets utilisateurs (tables temporaires, fonctions table et variables de type
table) génèrent, eux, des écritures dans le journal de transactions.
Au fil des versions de SQL Server, tempdb apporte de plus en plus d’optimisations,
dans la façon de gérer la journalisation des transactions, l’allocation et la libération
des objets. C’est un problème critique, car tempdb subit une grande quantité de créations et destructions d’objets, contrairement à une base de données utilisateur, qui
ne subit en utilisation normale que très peu de modifications d’objets. Ainsi, lorsque
tempdb est très sollicité, à cause par exemple d’une forte utilisation de tables temporaires dans le code SQL, il peut se produire une contention sur les structures du
fichier de données de tempdb (due aux allocations et libérations de pages et d’extensions pour gérer le contenu), ou sur les tables de métadonnées (due à un grand nombre de créations ou de suppressions d’objets). Ce risque de contention est diminué
par différentes méthodes (diminution du verrouillage des structures de données, ges-
