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 13/07/2011, 12h00   #1
Invité régulier
 
Inscription : août 2010
Messages : 53
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 53
Points : 6
Points : 6
Par défaut temps qui croit beacoup a cause d'une jointure

Bonjour tout le monde
voila j'ai une très grande requête qui marche très bien et surtout met 10 secondes a s’exécuter. seulement dès qui je lui ajout la jointure suivante
Code :
INNER JOIN REGLE_DYNAMIQUE RD1 ON RD1.TYPE_IMPUTATION = 'volume' AND RD1.regle_id = R.regle_id
le temps d’exécution augmente beaucoup (18 minutes sont passé au moment de l'écriture de ces lignes)
alors aidait moi svp

voila la requete :
Code :
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
SELECT cpr.cpf_cod,R.regle_id,affecter_us.section_numero,an.annuaire_id,((cast(fact.[VOL_FACTURE] AS decimal(14,4))/(tab.somme_des_volume_ndi*ISNULL(tab2.nombre_section,1)))*lgf_mtht) AS montant_impute_poste,lgf.oper_id,lgf.fct_num,lgf.lgf_num,/*an.annuaire_id,andi.ndi,*/fact.ndi_appelant,fact.[POSTE_APPELANT],u.utilisateur_nom,u.utilisateur_prenom--pos.poste_numero, u.utilisateur_id, cast(fact.[VOL_FACTURE] as decimal(10,2)) as V_Fact,(tab.somme_des_volume_ndi) as SumV_NDI, (tab2.nombre_section) as Nb_Sect, lgf_mtht, ((cast(fact.[VOL_FACTURE] as decimal(14,4))/(tab.somme_des_volume_ndi*ISNULL(tab2.nombre_section,1)))*lgf_mtht) as montant_impute_poste 
FROM lgf
INNER JOIN dbo.FCT ON dbo.FCT.CFA_COD = dbo.LGF.CFA_COD AND fct.FCT_NUM = LGF.FCT_NUM AND dbo.FCT.FCT_NUM = dbo.LGF.FCT_NUM AND dbo.FCT.OPER_ID = dbo.LGF.OPER_ID 
INNER JOIN dbo.U_OPERATEUR ON dbo.U_OPERATEUR.OPER_ID = dbo.LGF.OPER_ID  
LEFT JOIN dbo.OP_COMPTE_SERVICE_UTILISATEUR AS cs ON cs.CFA_COD = dbo.LGF.CFA_COD AND cs.FCT_NUM = dbo.LGF.FCT_NUM AND  cs.OPER_ID = dbo.LGF.OPER_ID AND cs.SOUS_COMPTE = dbo.LGF.CPR_COD 
LEFT JOIN dbo.UN_SERVICE ON dbo.UN_SERVICE.SERVICE_ID = cs.SERVICE 
LEFT JOIN dbo.UN_SOCIETE ON dbo.UN_SOCIETE.SOCIETE_ID = dbo.UN_SERVICE.SOCIETE_ID  
LEFT JOIN dbo.UN_SOUS_ENTITE ON dbo.UN_SOUS_ENTITE.SOUS_ENTITE_ID = dbo.UN_SOCIETE.SOUS_ENTITE_ID  
LEFT JOIN dbo.UN_ENTITE ON dbo.UN_ENTITE.ENTITE_ID = dbo.UN_SOUS_ENTITE.ENTITE_ID  
INNER JOIN dbo.CPR ON dbo.CPR.CFA_COD = dbo.LGF.CFA_COD AND dbo.CPR.FCT_NUM = dbo.LGF.FCT_NUM AND dbo.CPR.CPR_COD = dbo.LGF.CPR_COD AND dbo.CPR.OPER_ID = dbo.LGF.OPER_ID 
LEFT JOIN OP_TYPELIGNE_FACTURES o ON dbo.LGF.tch_cod=o.tch_cod AND dbo.LGF.gam_cod = o.gam_cod AND dbo.LGF.pft_cod = o.pft_cod AND dbo.LGF.ttr_cod = o.ttr_cod AND dbo.LGF.tus_cod = o.tus_cod   AND dbo.LGF.oper_id = o.oper_id 
LEFT JOIN dbo.TAR ON dbo.TAR.tar_cod = o.tar_cod  AND dbo.LGF.tar_lib = dbo.TAR.tar_lib AND dbo.TAR.tar_cod = o.tar_cod
LEFT JOIN (SELECT DISTINCT * FROM U_PRODGEN_FAC) p ON o.prod_type = PRODGEN_FAC_ID  
LEFT JOIN U_TYPECOMMGEN_FAC c ON comm_type = TYPECOMMGEN_FAC_ID  
LEFT JOIN cpf ON cpr.cpf_cod = cpf.cpf_cod AND cpr.fct_num = cpf.fct_num
LEFT JOIN (SELECT regle_id,regle_type,oper_id,cpf_cod,cpr_cod,tch_cod,gam_cod,pft_cod,ttr_cod,tus_cod,prodgen_id,commgen_id,entite_id,sous_entite_id,societe_id,service_id FROM regle) R ON cpf.cpf_cod LIKE R.cpf_cod AND LGF.cpr_cod LIKE R.cpr_cod AND LGF.tch_cod LIKE R.tch_cod AND LGF.gam_cod LIKE R.gam_cod AND LGF.pft_cod LIKE R.pft_cod AND LGF.ttr_cod LIKE r.ttr_cod AND LGF.tus_cod  LIKE r.tus_cod AND o.prod_type  LIKE r.prodgen_id AND   o.comm_type  LIKE r.commgen_id  AND  (un_entite.entite_id  LIKE r.entite_id OR un_entite.entite_id IS NULL) AND  (un_sous_entite.sous_entite_id  LIKE r.sous_entite_id OR un_sous_entite.sous_entite_id IS NULL) AND  (un_societe.societe_id  LIKE r.societe_id OR un_societe.societe_id IS NULL)  AND (un_service.service_id  LIKE r.service_id OR un_service.service_id IS NULL) AND cast(lgf.OPER_iD AS varchar(20)) LIKE r.oper_id AND regle_type='Dynamique'
INNER JOIN REGLE_DYNAMIQUE RD1 ON RD1.TYPE_IMPUTATION = 'volume' AND RD1.regle_id = R.regle_id 
LEFT JOIN (SELECT  FACTURE_ID,ZONE_GEO_ID,[NDI_APPELANT],sum([VOL_FACTURE]) AS vol_facture,[POSTE_APPELANT],compte   FROM U3_FLOISIRS10.dbo.OP_FACTURE_POSTE GROUP BY FACTURE_ID,ZONE_GEO_ID,[NDI_APPELANT],[POSTE_APPELANT],compte) fact ON fact.compte = cpr.cpf_cod
LEFT JOIN(SELECT ndi_appelant,sum(vol_facture) AS somme_des_volume_ndi FROM  U3_FLOISIRS10.dbo.OP_FACTURE_POSTE GROUP BY ndi_appelant) tab ON tab.ndi_appelant = fact.ndi_appelant
INNER JOIN ANNUAIRE_NDI andi ON fact.ndi_appelant = andi.ndi
INNER JOIN ANNUAIRES an ON an.ANNUAIRE_ID = andi.ANNUAIRE_ID 
 
LEFT JOIN postes pos ON an.annuaire_id = pos.annuaire_id AND fact.poste_appelant = '0'+pos.poste_numero 
LEFT JOIN AFFECTER_UTILISATEUR_POSTE affecter_up ON affecter_up.poste_numero= pos.poste_numero
LEFT JOIN utilisateurs u ON affecter_up.utilisateur_id = u.utilisateur_id
LEFT JOIN AFFECTER_UTILISATEUR_SECTION affecter_us ON affecter_us.utilisateur_id = u.utilisateur_id
LEFT JOIN SECTIONS s ON affecter_us.section_numero=s.section_numero AND s.annuaire_id = an.annuaire_id
LEFT JOIN (SELECT u.utilisateur_id, count(section_numero) AS nombre_section FROM [UNIDB_FLOISIRS10].[dbo].[UTILISATEURS] u ,dbo.AFFECTER_UTILISATEUR_SECTION us WHERE u.utilisateur_id = us. utilisateur_id   GROUP BY u.utilisateur_id) tab2 ON tab2.utilisateur_id =  u.utilisateur_id
LEFT JOIN unitic.dbo.OP_ZONE_GEO op_zone ON fact.ZONE_GEO_ID = op_zone.ZONE_GEO_ID
skouza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 17h40   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Sans :

- La structure de la table REGLE_DYNAMIQUE et ses index
- Le plan de requête (CTRL + M avant exécution de la requête)

Impossible de vous aider.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h03.


 
 
 
 
Partenaires

Hébergement Web