# Partition (base de données)

Dans une base de données, une partition est une division logique d'une table stockée en plusieurs parties indépendantes. Il peut être horizontal (les lignes d'une même table sont divisées en plusieurs partitions) ou vertical (les colonnes d'une même table sont divisées en plusieurs lots). Le partitionnement de tables est généralement effectué pour améliorer la gestion, la performance ou la disponibilité. Chaque partition peut être placée sur des serveurs ou des disques différents. Cela permet également d'obtenir une capacité de base de données supérieure à la taille maximum des disques durs ou d'effectuer des requêtes en parallèle sur plusieurs partitions.
Les principes de partitionnement de tables dans les SGBD reposent sur la famille d'algorithmes "diviser pour régner".

## Partitionnement horizontal

Le partitionnement horizontal d'une table divise les données en blocs de lignes, généralement en fonction de la clef primaire.

## Partitionnement vertical

Le partitionnement vertical d'une table divise les données en blocs de colonnes.

## Critères de partitionnement
### Partitionnement vertical

On décide généralement de partitionner une table de manière verticale lorsque celle-ci possède un degré trop élevé (le nombre de colonnes est appelé degré). On parle alors de table "obèse". Les critères retenus pour un partitionnement vertical sont généralement liés à l'usage de la table. On constate que certaines colonnes de la table sont lues de manière conjointe, tandis que d'autres sont ignorées. On isole alors les différentes colonnes lues conjointement pour former, en quelque sorte, des "sous-tables" liées par la clef primaire conjointe. Ce partitionnement permet de réduire la consommation des E/S (Entrées/Sorties) c'est-à-dire des pages lues ou écrites (moins d'utilisation du cache), comme de minimiser la quantité de données verrouillées lors des écritures (moins de blocages), il en résulte donc des gains de performance.
La table obèse montrée ci-avant, peut être découpée en plusieurs partitions verticales, chacune répondant à des besoins d'exploitation différents.
* Une première partition, concernera par exemple, les utilisateurs voulant connaître les informations de création et dernière exécution, de plan, et de "statement";
* Une seconde partition concernera les métriques d'exécution et de temps;
* Une troisième partition indiquera les métriques des lectures et écritures.
Il en résultera le découpage suivant :
Les gains de performances du partitionnement vertical seront d'autant plus grands si certaines partitions comportent de nombreuses lignes vides. En d'autres termes, si, lors du découpage, certaines partitions comprennent de nombreuses lignes vides, ces lignes seront éliminées, et la volumétrie du stockage sensiblement diminuée. En contrepartie, il faudra utiliser la technique de la jointure externe pour reconstituer les différentes informations de la table si le besoin se fait sentir d'exploiter simultanément différentes partitions de la table.
Ce type de partitionnement est généralement effectué par le responsable de l'architecture de la base, en d'autres termes le modélisateur. Il existe peu d'outils capables de proposer de manière automatique un tel partitionnement car il est nécessaire d'étudier l'exploitation de la table dans la durée et la fréquence sur une période assez longue avant de trouver les bonnes césures.

### Partitionnement horizontal

Les systèmes de gestion de base de données proposent le partitionnement d'une table selon différents critères. Cela nécessite une clef de partitionnement (en général une colonne de la table) et divisent la table suivant la valeur de la clef.
Les critères principaux sont les suivants :

#### 1 - Partitionnement par intervalles

    Les partitions sont déterminées par des domaines, chaque domaine étant constitué par une plage de valeurs continues. C'est généralement le cas du partitionnement par dates, dont les intervalles peuvent être mensuels, trimestriels, annuels...

#### 2 - Partitionnement par liste

    Le domaine du partitionnement est une liste de valeurs pour laquelle chaque partition ne contient exclusivement que la seule valeur de la partition. Considérons par exemple le cas d'une table que l'on désire partitionner par devise. La colonne de partitionnement Monnaie permettra de ventiler les lignes de la table suivant différentes devises, par exemple Euro, Dollar US, Livre Sterling, Yen ou Franc Suisse ce qui facilitera les calculs de conversion et de change.

#### 3 - Partitionnement par hachage

    Les partitions sont déterminées par un calcul pseudo aléatoire effectué sur une valeur arbitraire, par exemple un e-mail. On applique alors une fonction de hachage, généralement basique (pour que le calcul soit le plus rapide possible) et l'on calcule le modulo du résultat par rapport au nombre de partitions que l'on souhaite créer. Par exemple, si l'on désire utiliser 4 partitions, on appliquera le modulo 3 au résultat du hachage après avoir rendu le nombre positif (valeur absolue). Un tel calcul s'effectue comme suit :
    Une telle formule de calcul retournera une valeur entre 0 et 3.
    Ce type de partitionnement est souvent utiliser pour équilibrer la charge des partitions, dans le sens ou un partitionnement avec un critère sémantique particulier entraine, la plupart du temps, un déséquilibrage des partitions. Dans notre exemple de partitionnement par devise, il y a fort à parier que les partitions "Livre Sterling" et "Franc Suisse" devraient avoir une cardinalité bien moins élevé que "Dollar US" ou "Euro".

### 4 - partitionnement composite

    Le partitionnement composite permet de combiner plusieurs de ces schémas de partitionnement, par exemple en appliquant d'abord un partitionnement par intervalles puis un sous-partitionnement par hachage.

## Partitionnement sur Oracle

Le partitionnement de la base de données Oracle est un module de division des données d'Oracle, payant et fréquemment utilisé sur des tables de volumétrie importante.
Le partitionnement permet de découper une table ou un index sur des critères logiques. La table se comporte alors comme plusieurs tables de dimensions plus petites. Les avantages principaux du partitionnement sont :
* de pouvoir définir des critères de stockage différents pour chacune des partitions (tablespace, initial...)
* le découpage logique de la table permet un accès plus rapide aux informations (moins de lectures disques à effectuer en particulier)