72
Chapitre 4. Optimisation des objets et de la structure de la base de données
Figure 4.8 — Résultat de DBCC IND
Essayons maintenant ceci :
UPDATE dbo.longcontact
SET prenom = 'Albert'
WHERE longcontactId = 1;
Et relançons la requête sur sys.allocation_units. Nous n’avons plus que trois
pages : l’IAM et la page de données pour l’allocation In-row data, et seulement
l’IAM pour l’allocation Row-overflow data. La page de row overflow a été supprimée,
toute la ligne est revenue dans la page. La page d’IAM n’a pas été supprimée, elle
pourra être réutilisée au prochain dépassement.
SQL Server ne remet pas toujours la colonne dans la page In row lorsque la valeur
diminue. Il ne vérifie que la nouvelle valeur peut tenir dans la page que si elle a
diminué d’au moins 1 000 octets, ce qui lui évite de trop fréquentes vérifications.
Essayons autre chose :
TRUNCATE TABLE dbo.longcontact
GO
INSERT INTO dbo.longcontact (longcontactId, nom, prenom)
SELECT 2, REPLICATE('N', 5000), REPLICATE('P', 3100)
INSERT INTO dbo.longcontact (longcontactId, nom, prenom)
SELECT 3, REPLICATE('N', 5000), REPLICATE('P', 3100)
GO
Ici, nous forçons l’insertion de deux nouvelles lignes qui vont générer du dépassement, mais avec un remplissage de colonnes qui peut faire tenir deux lignes dans la
même page In-row… ce que va faire SQL Server. Il va créer en effet une seule page
In-row, et déplacer les deux colonnes nom dans deux pages de row overflow. Il faut
noter que les pages de row overflow contiennent des valeurs entières. Une colonne
ne peut pas être répartie sur plusieurs pages. C’est pour cette raison que le row overflow s’applique à des types variables limités à une taille de 8 000 octets (et à une
taille minimum de 24 octets, qui est l’espace nécessaire pour stocker le pointeur vers
la page de row overflow).
Cela nous amène à une dernière question : une page de row overflow peut-elle
partager des données venant de plusieurs lignes, ou faut-il une nouvelle page pour
chaque ligne en dépassement ? La seconde solution augmenterait le volume de stoc-
Chapitre 4. Optimisation des objets et de la structure de la base de données
Figure 4.8 — Résultat de DBCC IND
Essayons maintenant ceci :
UPDATE dbo.longcontact
SET prenom = 'Albert'
WHERE longcontactId = 1;
Et relançons la requête sur sys.allocation_units. Nous n’avons plus que trois
pages : l’IAM et la page de données pour l’allocation In-row data, et seulement
l’IAM pour l’allocation Row-overflow data. La page de row overflow a été supprimée,
toute la ligne est revenue dans la page. La page d’IAM n’a pas été supprimée, elle
pourra être réutilisée au prochain dépassement.
SQL Server ne remet pas toujours la colonne dans la page In row lorsque la valeur
diminue. Il ne vérifie que la nouvelle valeur peut tenir dans la page que si elle a
diminué d’au moins 1 000 octets, ce qui lui évite de trop fréquentes vérifications.
Essayons autre chose :
TRUNCATE TABLE dbo.longcontact
GO
INSERT INTO dbo.longcontact (longcontactId, nom, prenom)
SELECT 2, REPLICATE('N', 5000), REPLICATE('P', 3100)
INSERT INTO dbo.longcontact (longcontactId, nom, prenom)
SELECT 3, REPLICATE('N', 5000), REPLICATE('P', 3100)
GO
Ici, nous forçons l’insertion de deux nouvelles lignes qui vont générer du dépassement, mais avec un remplissage de colonnes qui peut faire tenir deux lignes dans la
même page In-row… ce que va faire SQL Server. Il va créer en effet une seule page
In-row, et déplacer les deux colonnes nom dans deux pages de row overflow. Il faut
noter que les pages de row overflow contiennent des valeurs entières. Une colonne
ne peut pas être répartie sur plusieurs pages. C’est pour cette raison que le row overflow s’applique à des types variables limités à une taille de 8 000 octets (et à une
taille minimum de 24 octets, qui est l’espace nécessaire pour stocker le pointeur vers
la page de row overflow).
Cela nous amène à une dernière question : une page de row overflow peut-elle
partager des données venant de plusieurs lignes, ou faut-il une nouvelle page pour
chaque ligne en dépassement ? La seconde solution augmenterait le volume de stoc-
