L’espace qu’une table utilise n’est pas entièrement débloqué après l’utilisation d’une instruction DELETE pour supprimer les données de la table dans SQL Server


Erreur # : 219514 (SQL Server 8,0)

Symptômes


Lorsque vous utilisez 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 entièrement officialisé. Lorsque vous essayez d’insérer des données dans la base de données, vous pouvez recevoir le message d’erreur suivant :
Impossible d’allouer de l’espace pour l’objet'TableName'dans la base de données "DatabaseName", car le groupe de fichiers’Primary’est saturé.
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 utilisées par une table de tas lorsque les conditions suivantes sont remplies :
  • Une suppression de ce tableau a lieu.
  • Un verrou au niveau de la table est maintenu.
Remarque Une table de tas est une table qui n’est pas associée à un index clusterisé. Si les pages ne sont pas désallouées, les autres objets dans la base de données ne peuvent pas réutiliser les pages. Toutefois, lorsque vous activez un niveau d’isolement basé sur la version de ligne dans une base de données SQL Server 2005, les pages ne peuvent pas être déplacées, même en cas de conservation d’un verrou au niveau de la table. Pour plus d’informations sur les niveaux d’isolement basés sur la version de ligne, voir la rubrique « utiliser les niveaux d’isolement en fonction du nombre de lignes » dans la documentation SQL Server 2005.

Solution de contournement


Pour contourner ce problème, appliquez l'une des méthodes suivantes :
  • Incluez une indication TABLOCK dans l’instruction DELETE si un niveau d’isolement basé sur la version de ligne n’est pas activé. Par exemple, utilisez une instruction semblable à ce qui suit :
    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 semblable à ce qui suit :
    TRUNCATE TABLE <TableName>
  • Créer un index clusterisé sur une colonne de la table. Pour plus d’informations sur la création d’un index clusterisé sur une table, voir la rubrique « Création d’un index clusterisé » dans la documentation en ligne de SQL Server.

Statut


Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.