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

SSIS Discussion :

Optimisation de temps de traitement. [2012]


Sujet :

SSIS

  1. #1
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut Optimisation de temps de traitement.
    Bonjour à tous.

    Je suis plutôt nouveau sous SSIS et je me retrouve confronté à un soucis de temps de traitement. Je vous explique le principe du package.

    J'ai 2 sources de données Oracles, sur lesquelles j'appliques 2 look up liée à des requêtes assez rapides à traiter. (le total des 4 look up représente 160 000 lignes environs).
    Les sorties avec correspondances mènent à une colonne dérivée qui me permet de modifier la valeur d'une des colonne et au final, l'ensemble des sources se retrouve dans un UNION ALL pour finir, via un Multi-diff, Une des colonnes est stockée dans le cache puisque je dois utiliser les identifiants récupérés dans la requête dans une autre partie du package. L'ensemble des lignes finis par une Dimension à Variation Lente qui va gérer mes insert/update de la base.

    J'ai augementé la taille du buffer en nombre de lignes à 350 000 lignes et de mon max buffer size à 30Mo. Mon soucis, est que, mes 2 sources retournent respectivement 500 000 et 600 000 lignes et que, lors des premières minutes de traitement je à environs 50 000 lignes traitées en moins de 10 minutes, après... mes ennuis commencent... plus ça va, plus c'est lent jusqu'à ne plus rien faire du tout.

    Est-ce que j'ai trop de données? est-ce que j'ai mal configuré mon buffer? Y'a-t-il un moyen pour que je puisse conserver des performances sensiblement équivalent du début à la fin de mon traitement?

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  2. #2
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Bonjour

    - Ou se trouve le bottleneck exactement ?
    - Il y'a 2 ou 4 lookup ? Et chacun a un target set to 160.000 records c'est ça ?
    - Comment est implémentée la dimension ? Et de quel SCD type est elle ?

    * Changer les buffer peut généralement aider à augmenter la capacité de traitement, mais les étapes du flow sont tout aussi importantes. Il faut donner un peu plus d'info quitte à attaché le package en soit pour voir un peu l'implémentation.

    D'après ce que je lis par rapport aux tâches, ainsi que les deux sources à +/- 1 million de record tout le package devrait facilement être réduit à un peu moins de 2 minutes. Il faut juste un peu plus de détails

    Cdlt
    M.
    Compil your life guy!
    The Aures Project

  3. #3
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    C'est pas tout simple tout simple.

    En fait, je fais un transfert d'un applicatif de gestion vers un CRM. Il ne s'agit donc pas de dimensions à proprement parler. J'ai 2 sources de données, L'une contient (après mise à jour des RG) 511 000 lignes à traiter et l'autre 100 000.

    Les look up, sont répartis au nombre de 2 par source de données et finissent tous par un UNION ALL afin de ne former plus qu'un seul jeu de données.

    Attacher les package me parait compliqué, mon chef boss sur le forum et serait pas trop content si il les voyait

    Hier, j'ai profité de mon intervention pour réfléchir un peu au problème, j'ai fait différents tests, notament sur le traitement et je tombais à 10k lignes traitées par minutes... J'ai testé au niveau des différents look up (désactivant ou non ces derniers pour voir comment se comportaient les flux. Et je me suis rendu compte que ma Dimension à variation lente me posait souci.

    J'ai donc coupé le package en 2 (un pour le mode d’initialisation de ma BDD et l'autre pour le run quotidien. (basé sur une récupération de date générée par les logs de traitement. (en gros si pas de date, j'init). Et dans la partie init, j'ai retiré les DVL pour tester si cela ne venait pas de là. Et miracle! j'ai pu traiter en 30minute l'ensemble de mes 7Millions de lignes (le package contient 8 flux, le plus gros étant celui qui me posait souci).

    Donc, ma question est... comment fonctionne les DVL parce que ça m'a réellement causé un énorme problème de performances. Pour la capture, je n'ai pas le temps dessuite, je ferais un Edit ce soir ou en début de journée demain matin.

    Merci du temps que m'as accordé
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  4. #4
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    Lynche,

    Un truc que j'ai du mal à saisir (désolé pour ma lenteur).
    La destination, est-ce bien une dimension à variation lente (communément appelée Slowly Changing Dimension -SCD) ou non?

    Si c'est le cas alors comment est-elle implémentée ?

    1- Si c'est via le composant SCD standard de l'ETL et si la dimension est de type 2 alors la solution est de changer vers une implémentation plus rapide, un exemple est de passer par le MERGE statement du TSQL qui permet en combinant deux statements de traiter et le SCD 1 et le SCD 2, s'il y a du SCD3 il faudra rajouter un 3ème statement, mais cela restement largement plus rapide que le composant standard

    2- Si c'est implémenté autrement, c'est quoi alors ?

    Le flow m'a l'air relativement simple donc il y'a moyen de réduire le temps de traitement considérablement.

    M.

    Pas de quoi ;-)
    Compil your life guy!
    The Aures Project

  5. #5
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Salut,

    En effet, j'ai pensé à passer par un merge pendant un temps (ayant plutôt des réflexes SQL à la base) je me suis dis qu'en dernier recours je ferais ça. J'ai opté pour le split de processus simplement parce que je "débute" dans le tout SSIS et que mon chef souhaite que je m'entraine le plus possible à l'utilisation des composants et donc, à travailler plus vite avec le logiciel .

    Pour ce qui est du SCD (j'ai la version française de VS2012) c'était ma première utilisation de ce composant et je ne connaissait ni son comportement précis, ni ses perfs qui peuvent être... hum..

    Bref, j'ai compris que sur un mode run ça pouvait passer, pour traiter quelques milliers de lignes, mais que pour avoir des performances sur de la volumétrie... autant passer par autre chose le MERGE notamment.

    Encore merci pour ton temps

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  6. #6
    Membre averti Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Points : 386
    Points
    386
    Par défaut
    A ta place j'utiliserai le merge sans hésiter vu la volumétrie, le composant standard est vraiment pourri pour cela comme tu as pu le constater.
    Voici un exemple générique de l'usage du Merge en TSQL pour satisfaire les SCD type 1, 2 et aussi 3.

    Dans le query:
    AttributX est de type 1
    AttributY est de type 2
    AttributZ est de type 3

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
     
    declare @row INT
    Set @row = 0
    DECLARE @rowcountsType TABLE
        (
            mergeaction NVARCHAR(10)
        )
    --Merge 1- Handling type 3 attributes
    Merge
        INTO DATAWAREHOUSE.DWH.DimensionXXX [TARGET]
        USING STAGING.DWH.StgDimensionXXX [SOURCE]
    ON
        (
            [TARGET].BK_Dimension = [SOURCE].BK_Dimension
        )
        WHEN MATCHED AND EXISTS
        (
            SELECT
             [TARGET].AttributZ
            EXCEPT
            SELECT
             [SOURCE].AttributZ
    ) -- SCD 3
    THEN
        UPDATE SET
            [TARGET].AttributZ_Old = [TARGET].AttributZ,
            [TARGET].ModifiedOn = GETDATE(),
            [TARGET].ModifiedBy = 'Package_Nom_DimensionXXX'
    OUTPUT $action
    INTO @rowcountsType;
     
     
     
     
    --Merge 2- Handling type 1 attributes
    Merge
        INTO DATAWAREHOUSE.DWH.DimensionXXX [TARGET]
        USING STAGING.DWH.StgDimensionXXX [SOURCE]
    ON
        (
            [TARGET].BK_Dimension = [SOURCE].BK_Dimension
        )
    WHEN NOT MATCHED THEN
        INSERT (
            BK_Dimension,
            AttributX,
            AttributY,
            AttributZ,
            CreatedOn,
            ModifiedOn,
            CreatedBy,
            ModifiedBy
            ,RowStartDate,
            RowEndDate,
            RowIsCurrent
        )
        VALUES (
            [SOURCE].BK_Dimension,
            [SOURCE].AttributX,
            [SOURCE].AttributY,
            [SOURCE].AttributZ,
            GETDATE(),
            NULL,
            'Package_Nom_DimensionXXX',
            NULL
            ,GETDATE(),
            NULL,
            1
        )
        WHEN MATCHED AND EXISTS
        (
            SELECT
             [TARGET].AttributX
            ,[TARGET].AttributZ
            EXCEPT
            SELECT
             [SOURCE].AttributX
            ,[SOURCE].AttributZ
    ) -- SCD 1
    THEN
        UPDATE SET
            [TARGET].AttributX = [SOURCE].AttributX,
            [TARGET].AttributZ = [SOURCE].AttributZ,
            [TARGET].ModifiedOn = GETDATE(),
            [TARGET].ModifiedBy = 'Package_Nom_DimensionXXX'
    OUTPUT $action
    INTO @rowcountsType;
     
     
     
     
    INSERT INTO DATAWAREHOUSE.DWH.DimensionXXX
    (
            BK_Dimension,
            AttributX,
            AttributY,
            AttributZ,
            CreatedOn,
            ModifiedOn,
            CreatedBy,
            ModifiedBy,
            RowStartDate,
            RowEndDate,
            RowIsCurrent
    )
    SELECT
            MERGE_OUT.BK_Dimension,
            MERGE_OUT.AttributX,
            MERGE_OUT.AttributY,
            MERGE_OUT.AttributZ,
            MERGE_OUT.CreatedOn,
            MERGE_OUT.ModifiedOn,
            MERGE_OUT.CreatedBy,
            MERGE_OUT.ModifiedBy,
            MERGE_OUT.RowStartDate,
            MERGE_OUT.RowEndDate,
            MERGE_OUT.RowIsCurrent
    FROM (
        MERGE DATAWAREHOUSE.DWH.DimensionXXX [TARGET]
        USING STAGING.DWH.StgDimensionXXX [SOURCE]
        ON (
            [TARGET].BK_Dimension = [SOURCE].BK_Dimension
        )
    WHEN MATCHED AND
            [TARGET].RowIsCurrent = 1 
        AND
        EXISTS(
            SELECT
             [TARGET].AttributY
            EXCEPT
            SELECT
             [SOURCE].AttributY
        ) -- SCD 2
    THEN
    UPDATE SET
            ModifiedOn = GETDATE(),
            ModifiedBy = 'Package_Nom_DimensionXXX',
            RowEndDate = GETDATE(),
            RowIsCurrent = 0
    OUTPUT $Action Action_Out,
            [SOURCE].BK_Dimension,
            [SOURCE].AttributX,
            [SOURCE].AttributY,
            [SOURCE].AttributZ,
            GETDATE() AS CreatedOn,
            GETDATE() AS ModifiedOn,
            'Package_Nom_DimensionXXX' AS CreatedBy,
            'Package_Nom_DimensionXXX' AS ModifiedBy,
            GETDATE() AS RowStartDate,
            NULL AS RowEndDate,
            1 AS RowIsCurrent
    ) AS MERGE_OUT
    WHERE
        MERGE_OUT.Action_Out = 'UPDATE'
    set @row=@@rowcount
    --we want to check and log how many records have been updated
    SELECT Isnull(Sum(CASE WHEN mergeaction = 'INSERT' THEN 1 ELSE 0 END), 0) + @row AS RecordsInserted,
           Isnull(Sum(CASE WHEN mergeaction = 'UPDATE' THEN 1 ELSE 0 END), 0) + @row AS RecordsUpdated
    FROM   @rowcountsType
    Compil your life guy!
    The Aures Project

  7. #7
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    J'avoue que le MERGE me tente sérieusement, rien que pour les perfs qui sont absolument incomparable. Je vais en discuter avec mon chef


    Encore merci pour tes éclaircissements
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

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

Discussions similaires

  1. optimiser le temp du traitement d'une boucle
    Par riad_09 dans le forum Développement
    Réponses: 1
    Dernier message: 05/11/2009, 08h38
  2. Réponses: 2
    Dernier message: 11/04/2009, 12h57
  3. optimisation du temps de traitement cat
    Par josepeemiasa dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 10/03/2008, 18h35
  4. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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