Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/01/2012, 16h55   #1
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
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 :
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
la_taxe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 17h08   #2
Modérateur
 
Homme
Administrateur de base de données
Inscription : août 2007
Messages : 1 159
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : août 2007
Messages : 1 159
Points : 1 608
Points : 1 608
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
Ptit_Dje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 17h22   #3
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
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
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 17h42   #4
Modérateur
 
Homme
Administrateur de base de données
Inscription : août 2007
Messages : 1 159
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : août 2007
Messages : 1 159
Points : 1 608
Points : 1 608
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 ?
Ptit_Dje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 22h39   #5
Invité de passage
 
Homme
Inscription : janvier 2012
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : janvier 2012
Messages : 2
Points : 0
Points : 0
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.
la_taxe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2012, 23h15   #6
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
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
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 10h23   #7
Modérateur
 
Homme
Administrateur de base de données
Inscription : août 2007
Messages : 1 159
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Belgique

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

Informations forums :
Inscription : août 2007
Messages : 1 159
Points : 1 608
Points : 1 608
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 ?
Ptit_Dje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 10h33   #8
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 725
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 725
Points : 6 849
Points : 6 849
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.

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 10h39   #9
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
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
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h02.


 
 
 
 
Partenaires

Hébergement Web