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.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour