Implémentation de la compression de ligne

Cette rubrique 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

Le tableau suivant décrit comment la compression de ligne affecte les types existants dans SQL Server. Il 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

Ce stockage est exactement le même que le format de stockage vardecimal. Pour plus d'informations, consultez Stockage des données décimales sous forme de colonne de longueur variable.

numeric

Oui

Ce stockage est exactement le même que le format de stockage vardecimal. Pour plus d'informations, consultez Stockage des données décimales sous forme de colonne de longueur variable.

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 10000 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 10000 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 avec des zéros ne sont pas stockés. La compression float est principalement applicable aux valeurs non fractionnaires de la mantisse.

real

Oui

Les octets les moins significatifs avec des zéros ne sont pas stockés. La compression real 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. La date occupe 2 octets. Il s'agit du nombre de jours depuis le 1/1/1901. À partir de 1902, deux octets sont nécessaires. Par conséquent, aucune économie n'est réalisée après cette date.

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 1/1/1900. 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. Représente la date à compter du 1/1/0001. 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.

  • 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 1/1/0001, avec une date limite située au 31/31/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 de remplissage quel que soit le classement utilisé.

varchar

Non

Aucun effet.

text

Non

Aucun effet.

nchar

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 de remplissage quel que soit le classement utilisé.

nvarchar

Non

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

Non

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.