5 votes

Sql Server : tables énormes sans rangées

J'ai une base de données Sql Server qui comporte quelques tables dont le nombre de lignes est nul mais qui occupent un espace combiné de 10 Go. Je peux le constater en faisant un clic droit sur les propriétés des tables en question (l'espace de données est énorme, entre 1 et 6 Go, et le nombre de lignes est nul sur ces tables). Je n'ai aucune idée de la cause de ce problème, car j'aurais pensé qu'un nombre de lignes nul signifierait un espace occupé quasi nul.

Des idées ?

5voto

BradC Points 2200

Reconstruire tous les index sur les tables, y compris l'index clusterisé. Depuis Livres en ligne :

La reconstruction d'un index chute et recrée l'index. Cela supprime fragmentation, récupère de l'espace disque en compactant les pages en fonction du facteur de remplissage spécifié ou existant spécifié ou existant, et réorganise les lignes de l'index dans des pages contiguës.

Quelque chose comme :

ALTER INDEX ALL ON [lc_db_user].[JMS_MESSAGES] REBUILD

DBCC SHRINKDATABASE ou (de préférence) DBCC SHRINKFILE ne fera quelque chose que si l'espace a été libéré de la table elle-même. Veuillez également vous assurer que vous êtes familier avec la fonction problèmes liés au rétrécissement des fichiers de base de données . En résumé, n'utilisez JAMAIS le rétrécissement automatique, ne rétrécissez les fichiers que lorsque c'est nécessaire, et faites toujours suivre d'une réindexation complète pour défragmenter tous les index que vous venez de fragmenter.

1voto

Une autre façon de traiter ce type de problème est d'utiliser l'instruction TRUNCATE TABLE :

TRUNCATE TABLE [lc_db_usr].[JMS_MESSAGES]

Toutefois, cela ne fonctionnera que sur les tables qui ne sont pas référencées par une contrainte FOREIGN KEY.

Pour plus de détails : http://msdn.microsoft.com/en-us/library/ms177570.aspx

0voto

Sixty4Bit Points 2664

Si la base de données contenait de nombreuses lignes de données, puis que ces données ont été supprimées des tables, le moteur de base de données ne réduira pas les fichiers. Il existe des commandes pour faire cela, je vais devoir les rechercher.

UPDATE : Une méthode que j'ai utilisée dans le passé est DBCC SHRINKDATABASE, vous pouvez trouver des détails sur TechNet. aquí

0voto

Mike Gates Points 185

Je n'arrive pas à poster une capture d'écran, mais ce que je fais, c'est un clic droit sur la table, aller dans les propriétés, et sous "Stockage" :

Data space: 2,152.883 MB
FileGroup: PRIMARY
Index space: 0.063 MB
Partition scheme: 
Row count: 0
Table is partitioned: False
Text filegroup: PRIMARY

Lorsque je fais SELECT * sur la table, je n'obtiens aucun résultat.

Voici le CREATE script (il y a un champ image à cet endroit) :

CREATE TABLE [lc_db_usr].[JMS_MESSAGES](
 [MESSAGEID] [int] NOT NULL,
 [DESTINATION] [varchar](150) NOT NULL,
 [TXID] [int] NULL,
 [TXOP] [char](1) NULL,
 [MESSAGEBLOB] [image] NULL,
PRIMARY KEY CLUSTERED 
(
 [MESSAGEID] ASC,
 [DESTINATION] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

0voto

C'est un peu bizarre mais ça marche :

Insérez une colonne fictive comme première colonne de votre tableau, puis enregistrez le tableau.

Enfin, supprimez la nouvelle colonne et enregistrez à nouveau le tableau.

Maintenant, vous aurez sûrement 0 octet utilisé.

Noel Paricollo

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X