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

MS SQL Server Discussion :

[SQL 2K8] Saturation du journal de transaction pendant un delete


Sujet :

MS SQL Server

  1. #1
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut [SQL 2K8] Saturation du journal de transaction pendant un delete
    Bonjour,
    Sur une base de dev utilisée pour de l'alimentation de cubes Olap, je cherche à vider une table.
    Cette table comporte, entre autre, un champ qui me permet via une jointure de filtrer une partie de celle-ci.

    Je cherche donc à supprimer dans cette table une partie des lignes ce qui sature le journal de transactions.

    Quelques détails :
    La base fait 25 Go avec 5Go de journaux, en mode simple.
    La table contient plus de 5 millions de lignes et je cherche en supprimer 99%.
    Je ne peux pas utiliser de truncate et boucler sur un nombre de ligne, pour supprimer par partie, me dérange particulièrement.
    J'exécute via un package SSIS à plusieurs moments de mon alimentation sur des tables différentes.
    J'ai un index cluster sur le champ utilisé pour ma jointure.
    Un sp_spaceused sur la table me renvois 817 Mo de data et 5 Mo d'index.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    delete Ir.FtPv 
    from Common.DimSource src
    JOIN Ir.FtPv ft
    	ON ft.SourceId = src.SourceId
    where
    	src.Code = 'S'
    Utilisant un plan faisant un Clustered Index Seek sur ma table de faits, un nested loops avec la table DimSource puis il termine par un Clustered Index Delete.


    J'ai pour le moment du mal à convaincre les DBA d'augmenter la taille du journal pour cette base de dev et à part faire un truncate manuel avant mon alimentation, je n'ai pas beaucoup de solution pour le moment

  2. #2
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Pas d'autres idées d'optimisation ou autre ?

  3. #3
    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
    Bonjour,

    Quel est ton mode de récupération pour la base concernée ?

    ++

  4. #4
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Désolé, oublié de préciser mais sur la dev comme l'homolo nous sommes en simple.

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Dans ce cas c'est que votre journal n'est pas configuré pour grossir automatiquement.
    Vous pouvez le voir dans les propriétés de la base de données, ou en interrogeant la table sys.database_files, et en regardant la colonne growth, éventuellement en combinaison avec is_percent_growth.
    Quelles valeurs avez-vous ?

    @++

  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
    D'autres pistes :

    Est ce qu'il y a d'autre index autre que l'index cluster sur la table ?
    Une désactivation de ceux-ci pourrait limiter la quantité d'informations dans le journal.

    As tu pensé à inverser la logique de mise à jour de ta table ?
    Tu dis que tu as environ 99% de données à supprimer. Alors dans ce cas tu pourrais copier les 1% de données non supprimés dans une table, d'opérer ensuite un TRUNCATE (journalisation mimime) et enfin de restaurer les données sauvegardés dans la table ...

    ++

  7. #7
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Dans ce cas c'est que votre journal n'est pas configuré pour grossir automatiquement.
    Vous pouvez le voir dans les propriétés de la base de données, ou en interrogeant la table sys.database_files, et en regardant la colonne growth, éventuellement en combinaison avec is_percent_growth.
    Quelles valeurs avez-vous ?

    @++
    Les fichiers du journal de transactions ne sont malheureusement pas en autogrowth. Le DBA voulant justement éviter que celui-ci enfle trop. D'où nos blocages.
    Il estime que ce journal devrait faire au max 33% de la taille de la base. Alors pour le moment, à part lui demander d'augmenter artificiellement la taille de la base...

    Citation Envoyé par mikedavem Voir le message
    D'autres pistes :

    Est ce qu'il y a d'autre index autre que l'index cluster sur la table ?
    Une désactivation de ceux-ci pourrait limiter la quantité d'informations dans le journal.
    Cet index est le seul de la table et ne représente pas 5go de données, ni lui, ni la table. Je ne comprends pas comment cette seule transaction utilise les 5go du journal ?

    Citation Envoyé par mikedavem Voir le message
    As tu pensé à inverser la logique de mise à jour de ta table ?
    Tu dis que tu as environ 99% de données à supprimer. Alors dans ce cas tu pourrais copier les 1% de données non supprimés dans une table, d'opérer ensuite un TRUNCATE (journalisation mimime) et enfin de restaurer les données sauvegardés dans la table ...
    ++
    C'est ce que l'on pense à faire, mais l'idée est de pouvoir conserver un processus générique et au plus simple. Ce n'est qu'une petite partie de l'ensemble de notre processus.


    Merci pour vos idées.

  8. #8
    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
    Ton DBA ne te simplifie pas la tâche ... et par conséquent restreint tes possibilités

    Il faut voir la quantité de données que tu supprimes car cela peut être tout à fait normal que ton journal grossisse de cette manière. Il faut bien enregistrer dans le journal tout ce qui est fait par ta suppression (Suppression des données, mise à jour de l'index, verrous posés etc ....) en cas de rollback par exemple.
    De plus vu que tu fais cela en une seule transaction, ce qui ne te permet pas de vider le journal au fur et à mesure ...

    ++

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 862
    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 862
    Points : 53 015
    Points
    53 015
    Billets dans le blog
    6
    Par défaut
    en 2005 vous pouvez boucler sur un DELETE TOP 100000... suivi d'un CHECKPOINT pour forcer la libération du journal, jusqu'à ce que @@ROWCOUNT = 0

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WHILE EXISTS(SELECT * FROM MaTable WHERE ???)
    BEGIN
       DELETE TOP 100000 FROM MaTable
       WHERE ???;
       IF @@ROWCOUNT = 0 BREAK;
       CHECKPOINT;
    END;
    A +

  10. #10
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Pratique ce "delete top"
    Avec des parenthèses autour de la valeur du top et c'est parfait.
    Je peux supprimer mes millions de lignes sans trop modifier mes process.

    Extra

  11. #11
    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
    Je ne peux pas utiliser de truncate et boucler sur un nombre de ligne, pour supprimer par partie, me dérange particulièrement
    Je croyais que cette solution ne t'allait pas ??

    ++

  12. #12
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Je n'avais pas en tête un delete top de cette forme et pensait devoir passer par une boucle plus complexe que cela.

    J'aurai du préciser.

  13. #13
    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
    Pas grave, c'était juste au moins pour savoir si nous nous avions bien compris ..

    Bonne suppression en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. editer le journal de transaction sql 2000
    Par kimo0147 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/07/2006, 10h37
  2. [SQL Server 2000] vider journal de transactions
    Par Abydos Business Group dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/03/2006, 19h28
  3. [SQL Server ] Récupération journal de transactions
    Par grellierj dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/02/2006, 18h31
  4. Réponses: 4
    Dernier message: 06/01/2006, 17h37
  5. Réduction du Journal de transactions SQL Server
    Par Aki dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/10/2004, 09h15

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