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é 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 ko 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, vous pouvez recevoir le message d’erreur suivant :

Could not allocate space for object 'TableName' in database 'DatabaseName' because the 'PRIMARY' filegroup is full.

Notes

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 vraies :

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

Notes

Une table de tas est une table qui n’est pas associée à un index en cluster.

Si les pages ne sont pas désattribué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 dans une base de données SQL Server 2005, les pages ne peuvent pas être libérées même si un verrou au niveau de la versioning-based table est maintenu. Pour plus d’informations sur les niveaux d’isolation des lignes, voir la rubrique « Utilisation des niveaux d’isolation basés sur le système de version de ligne » dans versioning-based SQL Server 2005 Books Online.

Solution de contournement

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

  • Incluez un conseil 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 semblable à ce qui suit :

    DELETE FROM <TableName> WITH (TABLOCK)
    

    Notes

    <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 semblable à ce qui suit :

    TRUNCATE TABLE <TableName>
    
  • Créez un index en cluster sur une colonne du tableau. Pour plus d’informations sur la création d’un index en cluster sur une table, voir la rubrique « Création d’un index en cluster » dans SQL Server Books Online.