Bonjour,

Je reste bloqué sur un problème de compréhension concernant le nombre de pages d'une table.

En modifiant le type d'une colonne de CHAR à VARCHAR le nombre de pages augmente au lieu de diminuer (avec des textes d'une longueur bien en deçà de la taille de la colonne).

J'ai fait un petit script pour reproduire mon problème de compréhension :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
 * Creation de la table
*/
CREATE TABLE USERS 
(
	ID INT NOT NULL IDENTITY(0, 1) PRIMARY KEY, 
	PRENOM CHAR(100),
	NOM CHAR(50),
	ADRESSE CHAR(200),
	VILLE CHAR(50)
)
GO
 
/* 
 * Insertion massive de données
*/
DECLARE @index int = 0
WHILE @index < 50000 BEGIN
    SET @index = @index + 1
	INSERT INTO USERS (PRENOM, NOM, ADRESSE, VILLE) VALUES (NEWID(), NEWID(), NEWID(), NEWID());
END
GO
 
/*
 * On affiche les infos
*/
DBCC showcontig ('USERS') WITH TABLERESULTS
GO
 
/*
 * Changement de type CHAR => VARCHAR
*/
ALTER TABLE USERS ALTER COLUMN PRENOM VARCHAR(100);
ALTER TABLE USERS ALTER COLUMN NOM VARCHAR(50);
ALTER TABLE USERS ALTER COLUMN ADRESSE VARCHAR(200);
ALTER TABLE USERS ALTER COLUMN VILLE VARCHAR(50);
GO
 
/*
 * On affiche les infos
*/
DBCC showcontig ('USERS') WITH TABLERESULTS;
GO
 
 
/*
 * On affiche les infos
*/
DROP TABLE USERS
GO
/*
 * Creation de la table avec des VARCHAR cette fois-ci
*/
CREATE TABLE USERS 
(
	ID INT NOT NULL IDENTITY(0, 1) PRIMARY KEY, 
	PRENOM VARCHAR(100),
	NOM VARCHAR(50),
	ADRESSE VARCHAR(200),
	VILLE VARCHAR(50)
)
GO
 
/* 
 * Insertion massive
*/
DECLARE @index int = 0
WHILE @index < 50000 BEGIN
    SET @index = @index + 1
	INSERT INTO USERS (PRENOM, NOM, ADRESSE, VILLE) VALUES (NEWID(), NEWID(), NEWID(), NEWID());
END
GO
 
/*
 * On affiche les infos
*/
DBCC showcontig ('USERS') WITH TABLERESULTS
GO
Ce script effectue ceci :
  • Création d'une table
  • Insertion de 50000 élements
  • showcontig pour connaitre le nombre de pages
  • Modification des colonnes de CHAR en VARCHAR
  • showcontig pour connaitre le nombre de pages
  • Suppression de la table
  • Recréation de la table mais cette fois ci avec des VARCHAR
  • insertion massive de 50000 élements
  • showcontig pour connaitre le nombre de pages


Je regarde le nombre de pages avec la colonne "Pages" avec l'instruction DBCC showcontig ('USERS') WITH TABLERESULTS
Les résultats obtenus sont les suivants :
  • La table avec des colonnes typées CHAR : 2 632 pages
  • Après modification du type CHAR en VARCHAR : 7 895 pages
  • Et lorsque la table a été construite avec des VARCHAR : 1 042 pages


Et là où est mon incompréhension : pourquoi n'y a t'il pas eu de réduction de pages après mon avoir effectuer la modification de CHAR en VARCHAR ? Est-ce du à une fragmentation ?

Merci pour vos lumières !