62
Chapitre 4. Optimisation des objets et de la structure de la base de données
En règle générale, une clé technique, auto-incrémentale (IDENTITY) ou non, sera
codée en INT. L’entier 32 bits permet d’exprimer des valeurs jusqu’à 2^31-1
(2 147 483 647), ce qui est souvent bien suffisant. Si vous avez besoin d’un peu plus,
comme les types numériques sont signés, vous pouvez disposer de 4 294 967 295
valeurs en incluant les nombres négatifs dans votre identifiant. Vous pouvez aussi
indiquer le plus grand nombre négatif possible comme semence (seed) de votre propriété IDENTITY, pour permettre à la colonne auto-incrémentale de profiter de cette
plage de valeurs élargie :
CREATE TABLE dbo.autoincrement (id int IDENTITY(-2147483648, 1)).
Pour les identifiants de tables de référence, un SMALLINT ou un TINYINT peuvent
suffire. Il est tout à fait possible de créer une colonne de ces types avec la propriété
IDENTITY.
N’oubliez pas que les identifiants sont en général les clés primaires des tables. Par
défaut, la clé primaire est clustered (voir les index clustered en section 6.1). L’identifiant se retrouve donc très souvent clé de l’index clustered de la table. La clé de
l’index clustered est incluse dans tous les index nonclustered de la table, et a donc une
influence sur la taille de tous les index. Plus un index est grand, plus il est coûteux à
parcourir, et moins SQL Server sera susceptible de l’utiliser dans un plan d’exécution.
Chaînes de caractères
Les chaînes de caractères peuvent être exprimées en CHAR ou en VARCHAR pour les
chaînes ANSI, et en NCHAR ou NVARCHAR pour les chaînes UNICODE. Un caractère
UNICODE est codé sur deux octets. Un type UNICODE demandera donc deux
fois plus d’espace qu’un type ANSI. La taille maximale d’un (VAR)CHAR est 8000. La
taille maximale d’un N(VAR)CHAR, en toute logique, 4000. La taille du CHAR est fixe,
celle du VARCHAR variable. La différence réside dans le stockage. Un CHAR sera
toujours stocké avec la taille déclarée à la création de la variable ou de la colonne, et
un VARCHAR ne stockera que la taille réelle de la chaîne. Si une valeur inférieure à la
taille maximale est insérée dans un CHAR, elle sera automatiquement complétée par
des espaces (caractère ASCII 32). Ceci concerne uniquement le stockage, les fonctions de chaîne de T-SQL et les comparaisons appliquant automatiquement un
RTRIM au contenu de variables et de colonnes. Démonstration :
DECLARE @ch char(20)
DECLARE @vch varchar(10)
SET @ch = '1234'
SET @vch = '1234 ' -- on ajoute deux espaces
SELECT ASCII(SUBSTRING(@ch, 5, 1)) – 32 = espace
SELECT LEN (@ch), LEN(@vch) -– les deux donnent 4
IF @ch = @vch
PRINT 'c''est la même chose' -– eh oui, c'est la même chose
SELECT DATALENGTH (@ch), DATALENGTH(@vch)
-- @vch = 6, les espaces sont présents.
Chapitre 4. Optimisation des objets et de la structure de la base de données
En règle générale, une clé technique, auto-incrémentale (IDENTITY) ou non, sera
codée en INT. L’entier 32 bits permet d’exprimer des valeurs jusqu’à 2^31-1
(2 147 483 647), ce qui est souvent bien suffisant. Si vous avez besoin d’un peu plus,
comme les types numériques sont signés, vous pouvez disposer de 4 294 967 295
valeurs en incluant les nombres négatifs dans votre identifiant. Vous pouvez aussi
indiquer le plus grand nombre négatif possible comme semence (seed) de votre propriété IDENTITY, pour permettre à la colonne auto-incrémentale de profiter de cette
plage de valeurs élargie :
CREATE TABLE dbo.autoincrement (id int IDENTITY(-2147483648, 1)).
Pour les identifiants de tables de référence, un SMALLINT ou un TINYINT peuvent
suffire. Il est tout à fait possible de créer une colonne de ces types avec la propriété
IDENTITY.
N’oubliez pas que les identifiants sont en général les clés primaires des tables. Par
défaut, la clé primaire est clustered (voir les index clustered en section 6.1). L’identifiant se retrouve donc très souvent clé de l’index clustered de la table. La clé de
l’index clustered est incluse dans tous les index nonclustered de la table, et a donc une
influence sur la taille de tous les index. Plus un index est grand, plus il est coûteux à
parcourir, et moins SQL Server sera susceptible de l’utiliser dans un plan d’exécution.
Chaînes de caractères
Les chaînes de caractères peuvent être exprimées en CHAR ou en VARCHAR pour les
chaînes ANSI, et en NCHAR ou NVARCHAR pour les chaînes UNICODE. Un caractère
UNICODE est codé sur deux octets. Un type UNICODE demandera donc deux
fois plus d’espace qu’un type ANSI. La taille maximale d’un (VAR)CHAR est 8000. La
taille maximale d’un N(VAR)CHAR, en toute logique, 4000. La taille du CHAR est fixe,
celle du VARCHAR variable. La différence réside dans le stockage. Un CHAR sera
toujours stocké avec la taille déclarée à la création de la variable ou de la colonne, et
un VARCHAR ne stockera que la taille réelle de la chaîne. Si une valeur inférieure à la
taille maximale est insérée dans un CHAR, elle sera automatiquement complétée par
des espaces (caractère ASCII 32). Ceci concerne uniquement le stockage, les fonctions de chaîne de T-SQL et les comparaisons appliquant automatiquement un
RTRIM au contenu de variables et de colonnes. Démonstration :
DECLARE @ch char(20)
DECLARE @vch varchar(10)
SET @ch = '1234'
SET @vch = '1234 ' -- on ajoute deux espaces
SELECT ASCII(SUBSTRING(@ch, 5, 1)) – 32 = espace
SELECT LEN (@ch), LEN(@vch) -– les deux donnent 4
IF @ch = @vch
PRINT 'c''est la même chose' -– eh oui, c'est la même chose
SELECT DATALENGTH (@ch), DATALENGTH(@vch)
-- @vch = 6, les espaces sont présents.
