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

Développement SQL Server Discussion :

sql server 2000 Pb d'exécution de procédure archivage


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut sql server 2000 Pb d'exécution de procédure archivage
    Bonjour tout le monde,

    Cette procédure archive toutes les prospections (table prospections) datant de plus de 6 ans ainsi que toutes les actions (table praction) relatives à ces prospections . Je ne comprend pas pourquoi l’exécution ne se finalise pas au bout de 25 min (et plus).Pourtant niveau syntaxe la procédure semble correcte.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    CREATE PROC dbo.ArchiveDonnées
    (
        @CutOffDate datetime = NULL
    )
    AS
    BEGIN
        SET NOCOUNT ON
     
        IF @CutOffDate IS NULL 
        BEGIN
            SET @CutOffDate = DATEADD (yyyy, -6, CURRENT_TIMESTAMP)
     
        END
     
    END
     
        BEGIN TRAN
     
            INSERT INTO Migration.dbo.migprospection
            SELECT * 
            FROM recette_670.dbo.prospection
            WHERE datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers Migration.dbo.migprospection', 16, 1)
                RETURN -1
            END
     
            INSERT INTO Migration.dbo.migpraction
            SELECT *
            FROM recette_670.dbo.praction
            WHERE fk_prospect IN
            (
                SELECT pk_prospect
                FROM dbo.prospection
                WHERE datefin < @CutOffDate
            )
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers Migration.dbo.migpraction', 16, 1)
     
                RETURN -1
            END
     
            DELETE dbo.praction
            WHERE fk_prospect IN
            (
                SELECT pk_prospect
                FROM dbo.prospection
                WHERE datefin < @CutOffDate
             )
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers recette_670.dbo.praction', 16, 1)
                RETURN -1
            END
     
            DELETE dbo.prospection
            WHERE Datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers recette_670.dbo.prospection', 16, 1)
                RETURN -1
            END
     
        IF @@TRANCOUNT > 0
        BEGIN
            COMMIT TRAN
            RETURN 0
        ENd
    GO

    Quelqu'un peut m'éclairer ?

    MERCI

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Bonjour,

    le fait que votre requête d'archivage ne se termine pas au bout de 25 minutes ne veut pas dire forcément qu'il y a problème!

    Le temps d'archivage dépends de beaucoup de paramètres comme la config du serveur, le nombre de lignes à archiver (insert dans la base d'archive et delete de la base cible), la taille de la base de données....

    cela dépend aussi du nombre de connexions à vos bases de données au moment de l'archivage (journée, nuit, week end...).

    au bout de plusieurs heures d'exécution cela peut être inquiétant. Personnellement, sur une base de +-10Go, avec archivage de presque 60% de données (SQL Server 2000) mes requêtes mettent 2H pour effectuer l'archivage.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut
    Après quelques minute d'attentes ,voici l'erreur :

    "Serveur : Msg 547, Niveau 16, État 1, Procédure ArchiveDonnées, Ligne 64
    Conflit entre l'instruction DELETE et la contrainte COLUMN REFERENCE 'FK__PRPRODUIT__FK_PR__75A278F5'. Le conflit est survenu dans la base de données 'recette_670', table 'PRPRODUIT', column 'FK_PROSPECT'.

    Serveur : Msg 50000, Niveau 16, État 1, Procédure ArchiveDonnées, Ligne 70
    une erreur est survenue lors de la copie des données vers recette_670.dbo.prospection
    L'instruction a été arrêtée.
    Procédure stockée*: recette_670.dbo.ArchiveDonnées
    Code de retour = -1"
    Il est vrai qu'il existe une table PRPRODUIT ds laquelle est référencée la clé étrangère "PK_PROSPECT" (clé primaire de table prospection).Est ce que celà empêche la copie de lignes ed la table prospection vers la base d'archive ? Et si c'est le cas , y'a t-il un moyen d'y remédier et comment ?

    MERCI

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 123
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par doudou8mc Voir le message
    Il est vrai qu'il existe une table PRPRODUIT ds laquelle est référencée la clé étrangère "PK_PROSPECT" (clé primaire de table prospection).Est ce que celà empêche la copie de lignes ed la table prospection vers la base d'archive ? Et si c'est le cas , y'a t-il un moyen d'y remédier et comment ?
    MERCI
    Non, cela n'empêche pas la copie de des données de la table recette_670.dbo.prospection vers la table Migration.dbo.migprospection, par contre ça empêche la suppression des lignes de cette table (recette_670.dbo.prospection) qui sont référencées par la table recette_670.dbo.PRPRODUIT.

    Il faudra faire l'archivage (copie ensuite delete) dans l'ordre.

    Dans ce cas là, il faudra archiver aussi les données de la table recette_670.dbo.PRPRODUIT et éventuellement d'autres tables qui possèdent des références de clefs étrangères vers TOUTES les clefs primaires de TOUTES les tables à archiver.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut
    ok merci ; la séquencement de l'archivage est bon (copie puis suppression); par contre , en effet , je pense aussi qu'il faudra créer toutes les tables liées à prospection par une contrainte référentielle.Je voulaisn éviter de passer par là.

    MERCI en tout cas

  6. #6
    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 : 42
    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,

    Veillez à utiliser des jointures plutôt que le prédicat IN, et à mettre le noms de vos colonnes plutôt que * dans vos SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    CREATE PROC dbo.ArchiveDonnées
    (
        @CutOffDate DATETIME = NULL
    )
    AS
    BEGIN
        SET NOCOUNT ON
     
        IF @CutOffDate IS NULL 
        BEGIN
            SET @CutOffDate = DATEADD (yyyy, -6, CURRENT_TIMESTAMP)
     
        END
     
        BEGIN TRAN 
            INSERT INTO Migration.dbo.migprospection
            SELECT colonnesDeLaTableProspection
            FROM recette_670.dbo.prospection
            WHERE datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers Migration.dbo.migprospection', 16, 1)
                RETURN -1
            END
     
            INSERT INTO Migration.dbo.migpraction
            SELECT colonnesDeLaTablePraction
            FROM recette_670.dbo.praction AS PRAC
            JOIN dbo.prospection AS PROS
    			ON PRAC.fk_prospect = PROS.pk_prospect
    		WHERE PROS.datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers Migration.dbo.migpraction', 16, 1)
     
                RETURN -1
            END
     
            DELETE FROM dbo.praction
            FROM dbo.praction AS PRAC
            JOIN dbo.prospection AS PROS
    			ON PRAC.fk_prospect = PROS.pk_prospect
    		WHERE PROS.datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers recette_670.dbo.praction', 16, 1)
                RETURN -1
            END
     
            DELETE FROM dbo.prospection
            WHERE Datefin < @CutOffDate
     
            IF @@ERROR <> 0
            BEGIN
                ROLLBACK TRAN
                RAISERROR ('une erreur est survenue lors de la copie des données vers recette_670.dbo.prospection', 16, 1)
                RETURN -1
            END
     
        IF @@TRANCOUNT > 0
        BEGIN
            COMMIT TRAN
            RETURN 0
        END
    GO
    IN n'est pas SARGable, même si ici SQL Server est suffisamment intelligent pour produire lui-même la jointure.

    Utiliser * est bien pour vous, pour avoir un aperçu de ce que contiennent vos tables.
    Mais si vous utilisez cela dans un module SQL (procédure, fonction, trigger, vue), alors le moteur de base de données est à chaque fois obligé d'interroger les tables de métadonnées pour connaître la liste des colonnes ainsi que leur type, ce dont on peut le dispenser facilement

    @++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 169
    Points : 76
    Points
    76
    Par défaut
    Merci du conseil. Si vous avez d'autres astuces pour optimiser les temps d'exécution je suis preneur, car c'est un problème pour moi qui suis débutant.

  8. #8
    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 : 42
    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
    A moindre coût, je ne peux que nous conseiller de lire le site de SQLPro et ses très bons papiers.

    Ensuite vous pouvez acheter des livres (vous ou votre entreprise), comme celui de SQLPro (encore lui !), et l'excellente liste qu'il a constitué.

    Globalement les livres SQL Server de chez APress sont de bonne qualité.
    Sachez néanmoins que vous ne trouverez là que les principes de l'optimisation (mais c'est déjà énorme), car celle-ci ne s'append pas : elle s'acquiert ... avec l'expérience

    @++

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

Discussions similaires

  1. Exécution d'une procédure stockée sous sql server 2000
    Par amirad dans le forum Développement
    Réponses: 2
    Dernier message: 27/04/2009, 09h50
  2. [sql server 2000] Procédure stockée ~ Récursif (débutant)
    Par Sadneth dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/02/2006, 11h16
  3. [SQL Server 2000][DTS][NET 1.1] Exécution d'un package DTS
    Par aldbaran dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/02/2006, 11h26
  4. [SQL SERVER 2000] Procédure RENAME?
    Par Tankian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/08/2004, 15h39

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