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 :

jointure avec SSIS


Sujet :

MS SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut jointure avec SSIS
    Bonjour,

    J'utilise depuis peu le module SSIS de MS SQL Server et je souhaiterais réaliser une jointure simple en langage sql, mais que je n'arrive pas a reproduire avec SSIS.

    La table [FactDelivery] est la table qui est issue des transformations que j'ai réalisées auparavant et [FactContract] une autre table de la base de données..

    Voici ma requête de base :
    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
    SELECT 
    	A1.*,
    	A8.sk_ContractType,
    	A8.am_Price
    INTO 
    	[FactDelivery1]
    FROM 
    	[FactDelivery] A1 LEFT JOIN 
    	[FactContract] A8
    	ON 
    		A1.sk_Product=A8.sk_Product and 
    		A1.sk_Customer=A8.sk_Customer and
    		YEAR(A8.dt_StartDate)<=A1.no_Year and
                    MONTH(A8.dt_StartDate)<=A1.no_Month and 
    		YEAR(A8.dt_EndDate)>=A1.no_Year and 
                    MONTH(A8.dt_EndDate)>=A1.no_Month
    Pour faire des jointures j'utilisais l'outil Lookup en faisant un mapping sur les variables.
    Sauf que les conditions de jointure ne sont pas du même type. les variales ne doivent pas forcément être égales, mais inférieures a égale....
    Je ne sais pas trop si je me fait bien comprendre, ce n'est pas facile a expliquer....
    Merci en tout cas

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Faites comme si toutes vos jointures etaient des =.
    Definissez votre composant lookup en partial cache.
    Allez ensuite dans l'onglet advanced du composant et editez la query pour remplacer les = par des <= ou autre.

    Je ne sais pas trop si j'ai repondu a votre question...

    NB: normalement le forum SSIS c'est par ici

  3. #3
    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
    C'est effectivement une des méthodes possible.
    par contre, attention aux perfs dans ce cas. Sur une volumétrie importante, cela peut être très pénalisant.

    L'autre possibilité est de faire une jointure FULL entre les 2 flux, puis d'utiliser le conditionnal split pour séparer les données selon les critères de jointures (>, <, etc.)
    En cherchant un peu il y avait un billet qui parlait de cela.
    Alexandre Chemla - Consultant MS BI chez Masao

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Jinroh77 Voir le message
    C'est effectivement une des méthodes possible.
    par contre, attention aux perfs dans ce cas. Sur une volumétrie importante, cela peut être très pénalisant.

    L'autre possibilité est de faire une jointure FULL entre les 2 flux, puis d'utiliser le conditionnal split pour séparer les données selon les critères de jointures (>, <, etc.)
    En cherchant un peu il y avait un billet qui parlait de cela.
    Qu'entends tu par une jointure FULL ?

    Dans ce cas (sans les conditions de jointure sur les dates):
    SELECT
    A1.*,
    A8.sk_ContractType,
    A8.am_Price
    [FactDelivery1]
    FROM
    [FactDelivery] A1 LEFT JOIN
    [FactContract] A8
    ON
    A1.sk_Product=A8.sk_Product and
    A1.sk_Customer=A8.sk_Customer

    et ensuite un conditional split sur l'output de ceci ?

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Ok merci bien pour l'aide
    J'ai réussi avec la méthode de Ptit_Dje
    En effet, ca impact pas mal les performances... mais ca marche.

    Dsl avoir posté dans le mauvais forum je n'avais pas vu la section SSIS.

  6. #6
    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
    Pardon, plutôt qu'une jointure FULL, c'est un produit cartésien qu'il faut réaliser.
    On a alors toutes les combinaisons possible, et de cela on ne conserve que celles vérifiant la condition de date.

    Effectivement, cela fait beaucoup plus de données, mais SSIS fait cela totalement en mémoire.

    Dans le cas du cache partiel, les accès à la base deviennent très fréquent alors que tout le but de SSIS est de travailler en mémoire.
    Alexandre Chemla - Consultant MS BI chez Masao

  7. #7
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Hello Jinroh77,

    Merci pour l'explication de cette technique.

    Je pense cependant que realiser un cross join des 2 tables sera un peu trop exagere au niveau des possibilites remontees.

    Par contre, effectuer dans un premier temps une jointure sur tous les champs devant etre egaux, permettra de remonter toute les lignes suffisantes en beneficiant du full cache (et donc bosser en memoire comme SSIS est cense faire ) pour ensuite effectuer un filtrage plus approfondi sur les criteres necessaires grace au conditional split et sur un nombre de lignes deja au prealable reduit.

    Qu'en penses tu ?

  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
    Personnellement je ferais également comme Ptit_Dje. Une équi-jointure suivie (pour ne remonter en mémoire que le strict nécessaire) d'un conditonnal split.

    ++

  9. #9
    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
    Effectivement,
    Je viens de relire la requête et il y a une partie des champs qui se traitent sur une égalité. Il faut alors profiter du cache du Lookup

    Ensuite, pour le reste, on utilise la montée en mémoire de SSIS.

    Par contre, attention à avoir suffisamment de mémoire sur le serveur car si il commence à swapper c'est mauvais
    Alexandre Chemla - Consultant MS BI chez Masao

Discussions similaires

  1. [SSIS][2k5] jointure avec condition
    Par Jenormand dans le forum SSIS
    Réponses: 4
    Dernier message: 11/07/2008, 10h51
  2. jointure avec clé composée de 2 colonnes
    Par free07 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/10/2005, 07h07
  3. Réponses: 2
    Dernier message: 27/10/2005, 11h15
  4. jointure avec xslt
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/09/2005, 10h48
  5. [SAGE]Jointures avec SGBD
    Par mat.M dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 09/10/2003, 12h23

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