Partager via


Implémentation de la compression de ligne

S’applique à : SQL Server Base de données Azure SQL Azure SQL Managed Instance

Cet article récapitule la manière dont le moteur de base de données implémente la compression de ligne. Elle fournit des informations de base qui vous aideront à planifier l'espace de stockage dont vous avez besoin pour vos données.

L'activation de la compression modifie uniquement le format de stockage physique des données qui sont associées à un type de données, mais pas leur syntaxe ni leur sémantique. Aucune modification de l'application n'est requise lorsqu'une ou plusieurs tables sont activées pour la compression. Le nouveau format de stockage des enregistrements propose les améliorations suivantes :

  • Il réduit la charge mémoire des métadonnées qui est associée à l'enregistrement. Ces métadonnées sont des informations sur les colonnes, leur longueur et leur décalage. Dans certains cas, la charge mémoire des métadonnées peut être plus importante qu'avec l'ancien format de stockage.

  • Il utilise le format de stockage de longueur variable pour les types de données numériques (par exemple integer, decimalet float) et les types reposant sur le type numérique (par exemple datetime et money).

  • Il stocke les chaînes de caractères de longueur fixe en utilisant le format de longueur variable, mais sans stocker les caractères blancs.

Remarque

Les valeurs NULL et 0 de tous les types de données sont optimisées et n'occupent aucun octet.

Conséquences de la compression de ligne sur le stockage

La table suivante décrit comment la compression de ligne affecte les types existants dans SQL Server et base de données Azure SQL. Elle n'indique pas les économies qui peuvent être réalisées en utilisant la compression de page.

Type de données Le stockage est-il affecté ? Description
tinyint Non 1 octet est la quantité de stockage minimale nécessaire.
smallint Oui Si la valeur rentre dans 1 octet, 1 seul octet est utilisé.
int Oui Utilise uniquement les octets nécessaires. Par exemple, si une valeur peut être stockée dans 1 octet, le stockage n'occupe qu'un seul octet.
bigint Oui Utilise uniquement les octets nécessaires. Par exemple, si une valeur peut être stockée dans 1 octet, le stockage n'occupe qu'un seul octet.
decimal Oui Utilise uniquement les octets nécessaires, quelle que soit la précision spécifiée. Par exemple, si une valeur peut être stockée dans 3 octets, le stockage n’occupe que 3 octets. L’encombrement du stockage est exactement le même que le format de stockage vardecimal.
numeric Oui Utilise uniquement les octets nécessaires, quelle que soit la précision spécifiée. Par exemple, si une valeur peut être stockée dans 3 octets, le stockage n’occupe que 3 octets. L’encombrement du stockage est exactement le même que le format de stockage vardecimal.
bit Oui La charge mémoire des métadonnées porte cette valeur à 4 bits.
smallmoney Oui Utilise la représentation des données de type entier sur un entier de 4 octets. La valeur monétaire est multipliée par 10 000 et la valeur entière résultante est stockée en supprimant tous les chiffres après la virgule. L'optimisation du stockage de ce type de données est semblable à celle des types de données entiers.
money Oui Utilise la représentation des données de type entier sur un entier de 8 octets. La valeur monétaire est multipliée par 10 000 et la valeur entière résultante est stockée en supprimant tous les chiffres après la virgule. Ce type a une plus grande plage que smallmoney. L'optimisation du stockage de ce type de données est semblable à celle des types de données entiers.
float Oui Les octets les moins significatifs comprenant des zéros ne sont pas stockés. La compressionfloat est principalement applicable aux valeurs non fractionnaires de la mantisse.
real Oui Les octets les moins significatifs comprenant des zéros ne sont pas stockés. La compressionreal est principalement applicable aux valeurs non fractionnaires de la mantisse.
smalldatetime Non Utilise la représentation des données de type entier sur deux entiers de 2 octets et correspond au nombre de jours écoulés depuis 1900-01-01. Il n’y a pas d’avantage à la compression de ligne pour la partie date de smalldatetime.

L'heure est le nombre de minutes depuis minuit. Les valeurs d'heure situées légèrement après 16h00 commencent à utiliser le deuxième octet.

Si un smalldatetime est utilisé uniquement pour représenter une date (ce qui est souvent le cas), l’heure est 0.0. La compression permet d'économiser 2 octets en stockant l'heure dans le format d'octet le plus significatif pour la compression de ligne.
datetime Oui Utilise la représentation des données de type entier sur deux entiers de 4 octets. La valeur entière représente le nombre de jours depuis la date de base du 1900-01-01. Les 2 premiers octets peuvent représenter jusqu'à l'année 2079. La compression permet toujours d'économiser 2 octets jusqu'à cette date. Chaque valeur entière représente 3,33 millisecondes. La compression épuise les 2 premiers octets dans les cinq premières minutes et a besoin du quatrième octet après 16h00. La compression permet donc d'économiser uniquement 1 octet après 16h00. Lorsque datetime est compressé comme tout autre entier, la compression permet d'économiser 2 octets dans la date.
date Non Utilise la représentation des données de type entier sur 3 octets. Ceci représente la date à compter du 0001-01-01. Pour les dates contemporaines, la compression de ligne utilise les 3 octets. Aucune économie n'est réalisée.
time Non Utilise la représentation des données de type entier sur 3 à 6 octets. Plusieurs précisions démarrent par un chiffre compris entre 0 et 9 et peuvent occuper entre 3 et 6 octets. L'espace compressé est utilisé comme suit :

Précision = 0. Octets = 3. Chaque valeur entière représente une seconde. La compression peut représenter l'heure jusqu'à 6h00 sur 2 octets, ce qui permet d'économiser potentiellement 1 octet.

Précision = 1. Octets = 3. Chaque valeur entière représente 1/10 seconde. La compression utilise le troisième octet avant 2h00. De petites économies sont ainsi réalisées.

Précision = 2. Octets = 3. Semblable au cas précédent, la réalisation d'économies est peu probable.

Précision = 3. Octets = 4. Dans la mesure où les 3 premiers octets sont occupés dès 5h00, peu d'économies sont réalisées par le biais de cette option.

Précision = 4. Octets = 4. Les trois premiers octets sont occupés dans les 27 premières secondes. Aucune économie n'est attendue.

Précision = 5, Octets = 5. Le cinquième octet sera utilisé après midi.

Précision = 6 et 7, Octets = 5. Ne réalise pas d'économies.

Précision = 8, Octets = 6. Le sixième octet sera utilisé après 3h00.

Il n'y a aucune modification dans le stockage pour la compression de ligne. Globalement, peu d'économies peuvent être attendues de la compression du type de données time .
datetime2 Oui Utilise la représentation des données de type entier sur 6 à 9 octets. Les 4 premiers octets représentent la date. Les octets occupés par la date dépendent de la précision de l'heure spécifiée.

La valeur entière représente le nombre de jours depuis le 0001-01-01, avec une date limite située au 31/12/9999. La représentation d'une date de l'année 2005 occupe 3 octets.

Aucune économie n'est réalisée sur les heures car 2 à 4 octets sont nécessaires pour différentes précisions d'heure. Par conséquent, pour une précision de l'heure à la seconde, la compression utilise 2 octets pour l'heure et occupe le deuxième octet après 255 secondes.
datetimeoffset Oui Similaire à datetime2, mais avec 2 octets de fuseau horaire au format (HH:mm).

Comme datetime2, la compression peut permettre d'économiser 2 octets.

Pour les valeurs de fuseau horaire, la valeur mm peut être 0 dans la plupart des cas. Par conséquent, la compression peut permettre d'économiser 1 octet.

Il n'y a aucune modification dans le stockage pour la compression de ligne.
char Oui Les caractères de remplissage à droite sont supprimés. Notez que le moteur de base de données insère le même caractère tampon quel que soit le classement utilisé.
varchar Non Aucun effet.
texte Non Aucun effet.
nchar Oui 1 Les caractères de remplissage à droite sont supprimés. Notez que le moteur de base de données insère le même caractère tampon quel que soit le classement utilisé.
nvarchar Non 1 Aucun effet.
ntext Non Aucun effet.
binary Oui Les zéros de droite sont supprimés.
varbinary Non Aucun effet.
image Non Aucun effet.
cursor Non Aucun effet.
timestamp / rowversion Oui Utilise la représentation des données de type entier sur 8 octets. Un compteur d'horodatage, dont la valeur commence à 0, est maintenu pour chaque base de données. Il peut être compressé comme toute autre valeur entière.
sql_variant Non Aucun effet.
uniqueidentifier Non Aucun effet.
table Non Aucun effet.
xml Non2 Aucun effet.
Types définis par l'utilisateur Non Représentés en interne sous la forme varbinary.
FILESTREAM Non Représentés en interne sous la forme varbinary.

1 La compression Unicode prend en charge les types de données de longueur fixe nchar et nvarchar. Les valeurs de données stockées hors ligne ou dans des colonnes nvarchar(max) ne sont pas compressées. La compression Unicode n’est pas prise en charge pour les données nvarchar(max), même si celles-ci sont stockées dans des lignes.

2 Les données hors ligne ne sont pas compressées lorsque la compression des données est activée. Par exemple, un enregistrement XML de plus de 8 060 octets utilise des pages hors ligne, qui ne sont pas compressées.