IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Table sans enregistrement occupe 132Mo de place


Sujet :

Administration SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut Table sans enregistrement occupe 132Mo de place
    Bonjour,

    je ne sais pas si c'est là qu'il faut que je mette cela mais bon
    je fais ici la question et la réponse, ceci pour ceux auront ce pb!

    ce matin une personne a vidé une table et je m'aperçois de ceci en exécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sp_spaceused 'CSAgePourCtEtStatut'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    name	                      rows    reserved	data	      index_size	unused
    CSAgePourCtEtStatut	0    	136280 KB	136048 KB	96 KB	   136KB
    après avoir vérifié que la table était bien vide je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC CHECKTABLE (CSAgePourCtEtStatut)
    et j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DBCC results for 'CSAgePourCtEtStatut'.
    There are 0 rows in 17006 pages for object "CSAgePourCtEtStatut".
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.
    je précise que la table n'a aucun index

    après recherche dans les scripts, la personne a effectué un delete sans clause where

    afin de libérer l'espace totalement, il suffit de faire un truncate
    voici le résultat après le truncate:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DBCC results for 'CSAgePourCtEtStatut'.
    There are 0 rows in 0 pages for object "CSAgePourCtEtStatut".
    DBCC execution completed. If DBCC printed error messages, contact your system administrator.
    Errare humanum est, perseverare diabolicum (Sénèque)

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par serge0934 Voir le message
    je précise que la table n'a aucun index
    Cherche pas, tu as ta réponse !
    J'ai une table sans indexes sur une vieille application sur laquelle il est appliqué quotidiennement un delete complet avant d'y importer des données à partir d'un fichier plat.
    Après quelques années, la table qui contenait seulement quelques milliers de lignes pesait plusieurs Go !
    J'ai remplacé le DELETE par un TRUNCATE dans le processus pourri et je suis revenu à quelque chose de décent.

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    A quoi cela est-il dû ?

    J'aimerais comprendre.

    J'utilise également une table sans index pour faire des imports depuis un fichier plat pour ensuite faire le dispatch des données à l'aide d'ordre sql et la table ne pèse pas bien lourd (entre 3 et 4 MB)
    Voici les propriétés de la table en question. Par contre, ça indique 0,063MB d'index. De quel index pourrait-il s'agir ? Il n'y a pas de clef primaire ni autre contrainte d'aucune sorte...

    Nom : Untitled.png
Affichages : 175
Taille : 51,2 Ko

    Je voudrais savoir si je risque également de me retrouver avec une table occupant une place considérable pour rien.
    Kropernic

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Commencez par faire un DBCC UPDATEUSAGE (Mabase, MaTable), pour réajuster les données statistiques de volumétrie...

    En effet, la volumétrie des objets n'est pas calculée en temps réel, ni de manière synchrone. Ce serait trop couteux et pénaliserait les perfs....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    L’instruction DELETE supprime une ligne à la fois et enregistre une entrée dans le journal des transactions pour chaque ligne supprimée.
    L’instruction TRUNCATE TABLE supprime les données en désallouant les pages de données utilisées pour stocker les données de la table. Elle enregistre uniquement les désallocations de page dans le journal des transactions.

    Comparée à l’instruction DELETE, l’instruction TRUNCATE TABLE offre les avantages suivants :
    • moindre espace du journal des transactions utilisé
    • moins de verrous utilisés

    On ne peut pas utiliser l'instruction TRUNCATE TABLE sur les tables qui :
    • sont référencées par une contrainte FOREIGN KEY ;
    • participent à une vue indexée ;
    • sont publiées à l'aide d'une réplication transactionnelle ou de fusion.

    Source : http://technet.microsoft.com/fr-fr/l...ql.105%29.aspx

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Lorsqu'une page est crée avec au moins une ligne de données 2 pages sont allouées : une page de données et une page IAM. Cette page est comptabilisée dans la colonne index_kb. Donc il est possible d'avoir une valeur > 0 dans ce cas.

    Après avoir fait un DBCC UPDATEUSAGE comme le préconise SQLPro, est-ce que tu peux nous donner le résultat de cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DBCC IND(MaBase, MaTable, -1);
    GO
    Tu remplace MaBase et MaTable par les objets concernées dans ton cas.

    ++

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    en effet, en cas de table heap (sans index cluster), les pages ne sont pas désallouées lors d'un DELETE.

    La doc mentionne cela :
    Citation Envoyé par MSDN
    When rows are deleted from a heap the Database Engine may use row or page locking for the operation. As a result, the pages made empty by the delete operation remain allocated to the heap. When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

    et propose trois solutions :
    1/ celle que vous avez mise en place, à savoir le truncate quand c'est possible.
    2/ une qui ne fonctionne pas (ajouter le hint TABLOCK)
    3/ et enfin, ajouter un index cluster avant le DELETE qu'il est possible de supprimer ensuite.
    (En fait, pour la troisième solution, on peut aussi ajouter puis supprimer l'index cluster après le DELETE.)

    Citation Envoyé par MSDN
    To delete rows in a heap and deallocate pages, use one of the following methods.

    Specify the TABLOCK hint in the DELETE statement. Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. This allows the pages to be deallocated. For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

    Use TRUNCATE TABLE if all rows are to be deleted from the table.

    Create a clustered index on the heap before deleting the rows. You can drop the clustered index after the rows are deleted. This method is more time consuming than the previous methods and uses more temporary resources.

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Lorsqu'une page est crée avec au moins une ligne de données 2 pages sont allouées : une page de données et une page IAM. Cette page est comptabilisée dans la colonne index_kb. Donc il est possible d'avoir une valeur > 0 dans ce cas.

    Après avoir fait un DBCC UPDATEUSAGE comme le préconise SQLPro, est-ce que tu peux nous donner le résultat de cette commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DBCC IND(MaBase, MaTable, -1);
    GO
    Tu remplace MaBase et MaTable par les objets concernées dans ton cas.

    ++
    Hello,

    Voici le résultat (en pièce jointe). C'est un fichier csv renommé en txt pour être accepté en pièce jointe.

    N.B. : La taille de la table a diminué par rapport à l'autre jour. J'imagine que je ne cours donc pas de risque .
    Fichiers attachés Fichiers attachés
    Kropernic

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/08/2014, 16h53
  2. Réponses: 3
    Dernier message: 07/01/2014, 15h28
  3. [AC-2000] Modifier une table grâce à un formulaire sans enregistrer
    Par B-CAB dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/07/2010, 15h14
  4. Réponses: 2
    Dernier message: 10/07/2009, 19h17
  5. Copie d'une table sans les enregistrements
    Par jmde dans le forum Access
    Réponses: 13
    Dernier message: 06/10/2006, 01h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo