# Extensible Storage Engine

Extensible Storage Engine (abr. ESE), aussi appelé Jet Blue est un moteur de base de données créé par Microsoft en 1996. Il est incorporé dans les systèmes d'exploitation de la série Windows NT et utilisé par les produits Active Directory et Exchange Server.
Il s'agit d'une bibliothèque logicielle qui manipule des bases de données selon la méthode séquentielle indexée (ISAM). Elle met en œuvre des mécanismes qui permettent de réaliser des transactions atomiques, cohérentes, isolées et durables (ACID) ainsi que des mécanismes de mémoire cache, de verrou et de journal (anglais log) en vue d'assurer la sécurité et la performance des opérations sur les bases de données.
Extensible Storage Engine est utilisé sur des bases de données dont la taille va de 1 mégaoctet à plus de 1 téraoctet.

## Histoire

Le développement du produit a commencé en 1996, il était initialement appelé Jet Blue (JET pour Joint Engine Technology), en référence à son concurrent Jet Red, le moteur de base de données de Microsoft Access. Puis a été renommé Extensible Storage Engine parce que les deux produits ont une programmation différente, une histoire différente, des fonctionnalités différentes et ne sont pas interchangeables$^,$.
il existe deux versions ESE97 et ESE98, en référence à leur année de sortie. La version ESENT, basée sur ESE97, est utilisée pour le service d'annuaire Active Directory.

## Fonctionnalités

Extensible Storage Engine s'utilise par appel des fonctions de son interface de programmation. Cette interface offre la possibilité d'enregistrer des données dans des tables, puis de les retrouver en utilisant des index et des curseurs. L'atomicité, la cohérence, l'isolation et la durabilité des modifications des données et des métadonnées effectuées de manière concurrente sont assurées par des transactions.
Extensible Storage Engine est équipé d'un mécanisme de mémoire cache, qui lit le contenu de la base de données à l'avance, et écrit avec retard, ce qui accélère les opérations.
Par le mécanisme de concurrence multi-versions, un logiciel qui lit le contenu de la base de données durant une transaction verra le contenu de la base de données dans l'état où il était au moment où la transaction a démarré. Les modifications ultérieures effectuées dans d'autres transactions ne seront pas visibles. Extensible Storage Engine annulera la transaction si des modifications viennent recouvrir d'autres modifications effectuées entre-temps dans d'autres transactions.
Extensible Storage Engine manipule les fichiers de base de données situées sur l'ordinateur. Les fichiers peuvent également être placés sur un autre ordinateur et manipulés par l'intermédiaire d'un système de fichiers distribué, cette utilisation est cependant déconseillée par le fabricant.

## Base de données

Les fichiers de base de données de Extensible Storage Engine sont faits d'un ensemble de pages de taille fixe de 4 ou 8 kilooctets - La taille des pages est déterminée à la création du fichier. Les pages sont reliées entre elles sur une structure en arbre B et contiennent une somme de contrôle (anglais checksum) qui permet de déceler d'éventuelles erreurs. Les pages contiennent les données, ainsi que les métadonnées du schéma et les index. Les pages sont créées à mesure que des données sont ajoutées à la base de données. Si une page commence à être pleine, Extensible Storage Engine scinde celle-ci en deux, crée une nouvelle page et adapte l'arbre B.
Chaque base de données est composée d'un fichier principal, éventuellement accompagné de fichiers temporaires contenant les transactions, les index et le journal des opérations. Extensible Storage Engine crée automatiquement des index et ceux-ci sont automatiquement supprimés s'ils n'ont pas été utilisés durant 8 jours.
les tables dans les bases de données ESE peuvent avoir une organisation non orthogonale, avec des champs qui ne sont pas présents dans tous les lignes de la table et des champs multi-valeurs. Les champs des enregistrements peuvent être de différents types de données, y compris monétaire, date, GUID, CLOB ou BLOB.
Chaque copie de Extensible Storage Engine peut manipuler jusqu'à 6 bases de données à la fois. Chaque processus utilisant ESE peut avoir jusqu'à 1 024 copies de ESE.
Une base de données peut être détachée d'une instance ESE en cours pour être attachée ensuite à la même instance ou à une instance différente. Pendant qu'elle est détachée, une base de données peut être copiée en utilisant des utilitaires Windows standards.

### Tables

La quantité d'espace de disque allouée à une table au sein d'une base de données est déterminée par un paramètre donné lorsque la table est créée avec l'opération CreateTable. Les tables croissent automatiquement en réponse à la création de données (enregistrement).
Les tables ont au minimum un index. Il doit y avoir au moins un index de cluster pour les données d'enregistrement. Lorsqu'il n'y a pas d'index de cluster défini par l'application, un index artificiel est utilisé qui ordonne et groupe les enregistrements par ordre chronologique d'insertion d'enregistrement.
Les index sont représentés en utilisant des arbres B+. ESE possède une fonctionnalité de compactage en-ligne qui re-compacte les données. Si une table devrait être fréquemment mise à jour, de l'espace peut lui être réservé pour des insertions futures en spécifiant une densité de page appropriée lors de la création d'une page ou d'un index.

### Enregistrements et colonnes

La taille maximale d'un enregistrement est de 8 110 octets pour des pages de 8 kilooctets avec l'exception des colonnes à longue valeur. Les types des colonnes "LongText" et "LongBinary" peuvent contenir des données d'une taille bien plus large que la taille de page de base de données. Ces données "long values" peuvent elles-mêmes faire jusqu'à 2 gigaoctets en taille.
Les enregistrements sont typiquement uniformes dans le fait que chaque enregistrement a un ensemble de valeurs pour le même ensemble de colonnes. Dans ESE, il est aussi possible de définir un grand nombre de colonnes pour une table, et de n'en avoir que quelques-unes de remplies de valeurs non nulles pour certains enregistrements. De même, une table peut aussi être une collection d'enregistrements hétérogènes.
ESE offre le support pour un large panel de valeurs de colonnes, allant en taille du bit seul jusqu'à des valeurs de 2 gigaoctets. Faire le choix des types de colonnes corrects est important parce que le type de la colonne détermine beaucoup de ses propriétés, incluant son ordonnancement pour les index. Voici la liste des types ayant un support dans ESE :
Types de colonnes
| Nom | Description |
| Bit | valeur ternaire (NULL, 0, ou 1) |
| Octet non signé | entier non signé sur 1 octet |
| court ("Short") | entier signé codé sur 2 octets |
| Court non signé | entier non signé sur 2 octets |
| Long | entier signé sur 4 octets |
| Long non signé | entier non signé sur 4 octets |
| Long Long | entier signé sur 8 octets |
| Monnaie | entier signé sur 8 octets |
| IEEE Single | Nombre à virgule flottante sur 4 octets |
| IEEE Double | Nombre à virgule flottante sur 8 octets |
| Temps / Date | Date ou temps codé sur 8 octets (date intégrale, temps fractionnel) |
| GUID | identifiant unique sur 16 octets |
| Binaire | chaîne binaire, de longueur ⇐ 255 octets |
| Texte | chaîne de caractère ANSI ou Unicode de longueur ⇐ 255 octets |
| Binaire long | Chaîne binaire de grande taille de longueur < 2 gigaoctets |
| Texte long | Chaîne de caractères de grande taille ANSI ou Unicode de longueur < 2 gigaoctets |
Colonnes fixes, variables et marquées Chaque table ESE peut définir jusqu'à 127 colonnes de longueur fixe, 128 colonnes à longueur variable et 64.993 colonnes marquées. Les colonnes fixes sont essentiellement des colonnes qui prennent la même quantité de mémoire pour chaque enregistrement, quelle que soit leur valeur. Les colonnes fixes utilisent 1 bit pour représenter une valeur nulle (NULL) et une quantité de mémoire fixe pour chaque enregistrement. Les colonnes variables utilisent 2 octets pour déterminer une valeur nulle (NULL), et une quantité d'espace mémoire variable pour chaque enregistrement dans lequel cette colonne est définie.
Les colonnes marquées sont des colonnes qui ne prennent aucune place en mémoire si elles ne contiennent aucun enregistrement. La même colonnes marquée peut contenir des valeurs multiples dans un seul enregistrement. Lorsque des colonnes marquées sont définies dans un enregistrement, chaque instance d'une colonne marquée prend approximativement 4 octets d'espace mémoire en plus de la taille de la valeur de l'instance de la colonne marquée. Lorsque le nombre d'instances d'une seule colonne marquée est important, l'entête de chaque instance de colonne marquée fait approximativement 2 octets.