Un base de données est un espace utilisateur pour le stockage permanent des objets utilisateur comme les tables et les indexes. Cet espace est alloué en un ou plusieurs fichiers.
Les bases sont divisées en pages logiques (de 8 KB chacune), et dans chaque fichier les pages sont numérotées de 0 à x, après la valeur supérieure x défini par la taille du fichier. Vous pouvez accéder à n'importe quelle page en spécifiant un ID de base, un ID de fichier et un numéro de page. Lorsque vous utilisez une commande ALTER DATABASE pour augmenter un fichier, le nouvel espace est ajouté à la fin du fichier. La première page du nouvel espace alloué est la page x + 1 sur le fichier. Lorsque vous réduisez une base avec la commande DBCC SHRINKDATABASE ou DBCC SHRINKFILE, les pages sont supprimées à partir des pages les plus hautes (à la fin). Cela garanti que les numéros de pages se suivent
La base master contient 49 tables système: les 18 mêmes tables que dans les bases utilisateurs plus 31 tables spécifiques à la base master. Dix de ces tables—syslockinfo, sysperfinfo, syscurconfigs, et sysprocesses—n'existent pas physiquement dans la base master ; en effet, elles sont reconstruisent à chaque fois qu'un utilisateur les interroge. Douze de ces tables contiennent des informations sur les serveurs distants; elles ne contiennent pas de données tant qu'aucun autre serveur n'est défini. La base master contient aussi 23 vues système: les 20 mêmes que dans les bases utilisateurs, plus trois vues additionnelles. Tous ces objets systèmes ont le nom qui commence par spt_. Pour voir la liste des tables et des vues système de la base master, vous pouvez exécuter ceci:
SELECT type, name FROM master..sysobjects WHERE type IN ('s', 'v') AND name NOT IN (SELECT name FROM model..sysobjects) GO |
la base master contient aussi 10 tables pseudo-système. Ces noms de tables commencent par spt_ et sont utilisées par différentes procédures stockées, mais ce ne sont pas de vraies tables système. Il ne faut pas les modifier sous risque de casser certaines procédures stockées. Cependant, les supprimer n'invaliderait pas l'intégrité basic de la base, ce qui est le cas si des tables systèmes sont altérées.
Lors de la création d'une table système via la commande CREATE DATABASE, un ID de base ou dbid lui est attribué et un nouvel enregistrement est ajouté dans master..sysdatabases. La table sysdatabases n'est contenu que dans la base master. La figure 5-4 montre un exemple de table sysdatabases, et la table 5-2 montre ses colonnes.
Les enregistrements de sysdatabases sont mis à jour lorsqu'un propriétaire ou un nom de base est modifié ou lorsqu'une option de base est changée.
Figure 5-4. Une vue partielle de la table sysdatabases.
Table 5-2. Les colonnes de la table sysdatabases.
Colonne | Information |
---|---|
name | Nom de la base. |
dbid | ID unique de la base; pouvant être réutilisé quand la base est supprimée. |
sid | ID système du créateur de la base. |
mode | Mode de verrouillage, utilisé en interne pendant la création de la base. |
status | Masque de bit qui montre si la base est en lecture seule, hors connexion, utilisée par un seul utilisateur ... Certaines de ces options sont posées par l'utilisateur avec la procédure stockée sp_dboption; les autres sont posées en interne. |
status2 | Un autre masque contenant des options additionnelles. |
crdate | Pour les bases utilisateur, cela indique la date de création de la base. Pour tempdb, c'est la dernière date de démarrage de SQL Server. Suivant les décisions faites durant l'installation, cela peut être la date à laquelle Microsoft a créée la base originale avant la livraison du produit, ou la date d'installation de SQL Server. |
reserved | Réservé pour une utilisation future. |
category | Un autre masque qui indique sur la base traite de la réplication. |
cmptlevel | Niveau de compatibilité de la base. |
filename | Chemin et nom du fichier primaire. |
suid | ID du compte de connexion SQL Server qui est propriétaire de la base. (La colonne sid contient le ID du créateur de la base, qui peut être ou non le propriétaire. La colonne suid représente toujours le propriétaire actuel. |
version | La version interne de SQL Server avec laquelle la base a été créée. |
Cet espace dans la base et utilisé pour stocker les tables et les indexes. L'unité d'espace est appelée extents. Un extent est constitué de 8 pages logiques contiguës (ou 64 KB). Pour rendre allocation d'espace plus efficace, SQL Server 7 n'alloue pas des extends entiers pour les tables avec peu de données. SQL Server 7 a deux types d'extends:
Une nouvelle page ou un nouvel index a ses pages allouées à partir d'un extend mixé. Lorsque la table ou l'index grossit, les prochaines allocations utilisent des extends uniformes.
Lorsqu'une table ou un index a besoin de plus de place, SQL Server doit en trouver. Si la table ou l'index fait moins de huit pages, SQL Server doit trouver un extend mixé avec de la place libre. Si la table ou l'index fait plus de huit pages, SQL Server doit trouver un extend uniforme. SQL Server utilise deux types de pages pour enregistrer quels sont les extends qui ont été alloué et de quel type (mixé ou uniforme) l'extend est disponible pour:
Voici une table contenant les combinaisons de bits des pages GAM et SGAM.
Utilisation de l'extend | Bit GAM | Bit SGAM |
---|---|---|
Libre, non utilisé | 0 | 0 |
Extend uniforme, ou mixé et plein. | 1 | 0 |
Extend mixé avec des pages libres | 1 | 1 |
SQL Server peut rapidement localiser les GAMs dans un fichier, car une page GAM est toujours la troisième page (page 2) dans un fichier. Et une page SGAM est la quatrième (page 3). Une autre GAM apparaît tous les 64,000 extents (512,000 pages) après la première GAM de la page 2, et une autre SGAM tous les 64,000 extents (512,000 pages) après la première SGAM sur la page 3. La page 0 dans chaque fichier est la page d'en-tête. La page 1 est la page PFS (Page Free Space).
Les pages IAM (Index Allocation Map) mappent les extents utilisés par un heap ou un index dans le fichier de base de données. Un heap est une table sans index cluster. Chaque heap ou chaque index a une ou plusieurs pages IAM qui enregistrent tous les extends alloués à l'objet. Un heap ou un index a au moins une page IAM sur chaque fichier sur lequel il y a des extends. Un heap ou un index peuvent avoir plus d'une page IAM sur un fichier si la rangée d'extends dépasse la rangée qu'une page IAM peut enregistrer.
Une page IAM contient un entête, huit pointeurs de page, et une série de bits qui mappe une rangée d'extends sur un fichier. L'entête a l'adresse du premier extend dans la rangé mappée par la page IAM. Les huit pointeurs de page indiquent des pages appartenant aux objets contenus dans les extends mixé; seule la première page IAM pour un objet aura des valeurs dans ces pointeurs. Une fois que l'objet fait plus de huit pages, tous ses extends sont mixés— ce qui veut dire qu'un objet n'aura jamais besoin de plus de huit pointeurs de page dans les extends mixés. Si des enregistrements sont effacés d'une table, cela peut prendre moins de huit de ces pointeurs. Chaque bit du bitmap représente un extend dans la rangée, que l'extend alloué à l'objet possède ou pas la page IAM. Si un bit vaut 1, l'extend relatif dans la rangée est alloué à l'objet qui possède la page IAM. Si un bit vaut 0, l'extend relatif n'est pas alloué à l'objet qui possède la page IAM.
Par exemple, si la rangée de bit de la page IAM vaut 11000000, cela veut dire que les deux premiers extends dans la rangée couverte par la page IAM sont alloués à l'objet qui possède la page IAM et les extends 3 à 8 ne sont pas alloués à l'objet qui possède la page IAM.
Les pages IAM sont allouées au fur et à mesure pour chaque objet et sont situées au hasard dans le fichier de base de données. Chaque page IAM couvre une rangée possible de 512,000 pages. Sysindexes.FirstIAM pointe sur la première page IAM pour un objet. Toutes les pages IAM pour cette objet sont chaînées.
NOTE
Dans un heap, les pages de données et les enregistrements qui sont dedans ne sont pas dans un ordre spécifique et ne sont pas chaînés. La seule connexion logique entre les pages de données est faite dans les pages IAM.
Une fois que les extends ont été alloués à un objet, SQL Server peut utiliser les pages de ces extends pour insérer de nouvelles données. Si la donnée est insérée dans un arbre-B, elle est ordonnée dans l'arbre. Si la donnée est insérée dans un heap, elle est insérée dans n'importe quel espace libre. Les pages PFS d'un fichier enregistre qu'une page individuelle a été allouée et la quantité d'espace libre sur chaque page. Chaque page PFS couvre 8000 pages contiguë (presque 64 MB). Pour chaque page, la page PFS a un bit pour indiquer si la page est vide, 1_25 pour-cent pleine, 26_50 pour-cent pleine, 51_75 pour-cent pleine, ou plus de 75 pour-cent pleine. cette information est utilisée lorsque SQL Server a besoin de trouver un page avec suffisamment de place libre pour stocker un nouvel enregistrement. La seconde page (page 1) dans un fichier est une page PFS, comme toutes les 8000 ème après.