L’espace utilisé par une table n’est pas complètement libéré après l’utilisation d’une instruction DELETE pour supprimer des données de la table dans SQL Server

Cet article vous aide à contourner le problème qu’une table utilise ne peut pas être libérée après avoir utilisé une instruction DELETE pour supprimer toutes les données de la table.

Version du produit d’origine : SQL Server
Numéro de la base de connaissances d’origine : 913399

Symptômes

Après avoir utilisé une instruction DELETE dans Microsoft SQL Server pour supprimer des données d’une table, vous remarquerez peut-être que l’espace utilisé par la table n’est pas complètement libéré. Lorsque vous essayez ensuite d’insérer des données dans la base de données, le message d’erreur suivant peut s’afficher :

Impossible d’allouer de l’espace pour l’objet « TableName » dans la base de données « DatabaseName », car le groupe de fichiers « PRIMARY » est plein.

Remarque

TableName représente le nom de la table. DatabaseName représente le nom de la base de données qui contient la table.

Cause

Ce problème se produit car SQL Server libère uniquement toutes les pages qu’une table de tas utilise lorsque les conditions suivantes sont remplies :

  • Une suppression sur cette table se produit.
  • Un verrou au niveau de la table est maintenu.

Remarque

Une table de segments de mémoire est toute table qui n’est pas associée à un index cluster.

Si les pages ne sont pas libérées, les autres objets de la base de données ne peuvent pas réutiliser les pages.

Toutefois, lorsque vous activez un niveau d’isolation de ligne versioning-based dans une base de données SQL Server, les pages ne peuvent pas être libérées même si un verrou au niveau de la table est maintenu. Pour plus d’informations sur les niveaux d’isolation de ligneversioning-based, consultez Niveaux d’isolation dans le moteur de base de données SQL Server.

Solution de contournement

Pour contourner ce problème, utilisez l’une des méthodes suivantes :

  • Incluez un indicateur TABLOCK dans l’instruction DELETE si un niveau d’isolation basé sur le contrôle de version de ligne n’est pas activé. Par exemple, utilisez une instruction similaire à la suivante :

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Remarque

    <TableName> représente le nom de la table.

  • Utilisez l’instruction TRUNCATE TABLE si vous souhaitez supprimer tous les enregistrements de la table. Par exemple, utilisez une instruction similaire à la suivante :

    TRUNCATE TABLE <TableName>
    
  • Créez un index cluster sur une colonne de la table. Pour plus d’informations sur la création d’un index cluster sur une table, consultez Créer des index cluster.