SQL Server et le Page Split : Quand la Base de Données se met à danser
Publié le 15/02/2025
Par  Johan Coureuil

SQL Server et le Page Split : Quand la Base de Données se met à danser

Introduction

Si vous avez déjà travaillé avec SQL Server, vous avez sans doute entendu parler du terme Page Split (éclatement de page). Ce phénomène, souvent sous-estimé, peut avoir des conséquences directes sur les performances de votre base de données. Mais qu'est-ce qu'un Page Split exactement, et pourquoi se produit-il ? Cet article décompose le mécanisme du Page Split et vous explique son impact sur les opérations d'insertion et de tri des données.

1. Comprendre la structure des pages en SQL Server

SQL Server stocke ses données dans des structures organisées en pages de 8 Ko. Chaque page appartient à une unité d'allocation appelée extent, et les tables/indexes utilisent ces pages pour y insérer et lire les données.

Par défaut, SQL Server charge les pages en mémoire (buffer pool) pour éviter des lectures physiques trop fréquentes sur le disque. Mais lorsque des insertions ou des mises à jour doivent être effectuées, SQL Server doit organiser ces pages pour maintenir l'ordre des données, en particulier lorsque des index sont présents.

2. Comment se produit un Page Split ?

Un Page Split survient lorsqu'une page existante n'a plus assez d'espace libre pour insérer une nouvelle ligne tout en maintenant l'ordre des données. SQL Server doit alors créer une nouvelle page et redistribuer une partie des données entre les deux pages.

Prenons un exemple concret :

  1. Vous insérez dans une table les valeurs (varchar) suivantes dans une colonne indexée :

    • "A"

    • "C"

  2. Plus tard, vous ajoutez "B", qui doit être insérée entre les deux autres pour respecter l'ordre de l'index.

  3. Si la page contenant les lignes "A" et "C" est pleine, SQL Server doit diviser la page en deux :

    • La moitié des données reste sur la page initiale.

    • L'autre moitié est déplacée vers une nouvelle page.

    • La ligne "B" peut maintenant être insérée dans le bon ordre.

Ce même principe s'applique aux valeurs numériques :

  • Vous insérez 1, 2, 4.

  • Plus tard, vous ajoutez 3.

  • Si la page est pleine, une scission est nécessaire.

3. Impact des Page Splits

a) Impact sur la performance

  • Consommation de ressources : Un Page Split implique des opérations d'écriture sur le disque et des mises à jour de plusieurs pages, ce qui augmente la charge E/S.

  • Fragmentation : La division des pages entraîne une fragmentation logique et physique de l'index, rendant les parcours plus lents.

  • Impact sur le Buffer Pool : Si la page n'est pas en mémoire, SQL Server doit la charger physiquement depuis le disque, augmentant ainsi la latence.

b) Conséquences sur le stockage

Les Page Splits peuvent rapidement faire gonfler la taille d'un index, car ils créent de nouvelles pages et rendent les parcours de données moins optimisés.

4. Comment limiter les Page Splits ?

Nous avons traité les index en détail, ici, voici quelques pistes pour limiter ces effets :

  • Définir un Fill Factor adapté : En réservant un peu d'espace libre dans les pages (éviter qu'elles soient complètement pleines), on prévient la nécessité de scinder les pages trop souvent.

  • Qu'est-ce que le Fill Factor ? Le Fill Factor est un paramètre permettant de définir le pourcentage d'espace à remplir dans chaque page d'index. Une valeur plus basse réduit le risque de Page Split mais peut augmenter la taille globale de l'index.

  • Privilégier les insertions batchées pour limiter les modifications intempestives.

 

Conclusion

Les Page Splits sont un effet naturel du fonctionnement de SQL Server, mais leur impact sur les performances peut être significatif si on ne les anticipe pas. En comprenant ce mécanisme et en adaptant sa stratégie d'insertion de données mais également de suppressions, on peut minimiser ces interruptions et améliorer l'efficacité de son système.
C'est pourquoi il est recommandé de surveiller régulièrement l'état des index et d'effectuer des reconstructions (rebuild) afin de limiter la fragmentation et d'optimiser les performances.

Johan Coureuil

Johan Coureuil

Développeur Back-End C# .NET & DBA SQL Server