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 :

[Grosse requete] Lenteur innexpliquée


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut [Grosse requete] Lenteur innexpliquée
    [SQL serveur 2000]


    J'ai une grosse requete qui est basée sur une vingtaines de table et de vue qui fonctionne bien lorsque je selectionne que le code client.

    (Ca m'embete un peu de poster tout le code ici car il est long et il y a beaucoup de tables associées)

    Bref la requete prend 20 secondes a renvoyer les lignes qu'on lui demande si on selectionne que le code client. Si j'ajoute une autre colonne je passe a 1 demi heure. (et j'ai 31 colonnes à selectionner)

    J'ai utilisé des inner join et left outer join plutot que les where. Bref si vous avez une idée !

    Un GRAND MERCI pour votre aide


  2. #2
    LXS
    LXS est déconnecté
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 106
    Points : 137
    Points
    137
    Par défaut
    Que te dit le plan d'exécution? Est-il modifié par l'ajout de cette fameuse colonne?

  3. #3
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Le plan d'execution est effectivement affecté par cela.. mais ca ne m'explique pas tout.

    En effet, si je selectionne une colonne de la table 2 (on va dire), ca passe bien et si prend une deuxieme colonne de cette table 2 ca ne passe pas.

    (le plan d'execution est différent)

    Sachant que les enregistrements de ces deux colonnes de cette table 2 ne sont pas uniques (il s'agit d'une date et de l'agent associé a cette date)

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Je te suggère de jeter un oeil sur mon article :
    http://rudi.developpez.com/sqlserver.../optimisation/
    Qui peut te donner des pistes pour améliorer cela, notamment avec un index.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  5. #5
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    J'ai lu votre article et ca m'a aidé a mieux comprendre certaine chose mais il demeure plusieurs question.

    Comment forcer SQL serveur a emprunter un plan d'execution ?
    Comment découper le plan d'execution pour l'imprimer sur plusieurs A3 (Il es masta Grand)

    Bref normalement je devrai poser des index sur plusieurs colonnes pour les tables qui m'interressent.. Mais c'est tout de meme bizarre qu'a demander des colonnes supplementaires, on augmente considerablement le temps de reponse !!

    Encore Merci pour votre aide

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Il faut éviter de forcer un plan d'exécution. SQL Server a un très bon optimiseur et ses choix sont en général les meilleurs.

    Je n'ai jamais vraiment imprimer un plan d'exécution, je le parcours sur l'écran.

    Si tu ajoutes un critère sur une colonne, et que cette colonne n'est pas indexée, probablement SQL Server est obligé de scanner la table pour filter selon ton critère.
    Poste tout de même ton code, qu'on se fasse une idée.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  7. #7
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Juste avant d'en arriver a bourrer le code ici.. J'insiste juste sur le fait que c'est la meme requete qui a des temps de reponse qui varie de 14 secondes a 30 minutes selon que l'on selectionne une ou toutes les colonnes voulues.

    Les jointures et les conditions restent les memes !!!

    Vous voullez toujours voir le code ?!?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par b_lob
    Juste avant d'en arriver a bourrer le code ici.. J'insiste juste sur le fait que c'est la meme requete qui a des temps de reponse qui varie de 14 secondes a 30 minutes selon que l'on selectionne une ou toutes les colonnes voulues.

    Les jointures et les conditions restent les memes !!!

    Vous voullez toujours voir le code ?!?
    oui ainsi que le définition des colonnes que tu choisies (enfin celle qui ralentissent)

  9. #9
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Citation Envoyé par b_lob
    c'est la meme requete qui a des temps de reponse qui varie de 14 secondes a 30 minutes selon que l'on selectionne une ou toutes les colonnes voulues.

    Les jointures et les conditions restent les memes !!!
    C'est tout à fait possible, peux-tu aussi décrire les modifications de plan d'exécution, par exemple l'apparition d'un bookmark lookup ?

    Tu peux aussi activer dans Query Analyzer / SSMS les statistiques client, pour voir si le volume de données transitant sur le réseau augmente beaucoup. Mais ce n'est certainement pas ce dernier élément qui ferait ainsi exploser les temps de réponse.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  10. #10
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Encore Merci pour ton aide Rudib !!

    Je n'ai pas de bookmark lookup mais beaucoup de Hash Match Right outer join et Inner Join. (Ce sont les plus couteux en pourcentage)

    C'est vrai que ma requete contient 38 jointures...

    (ce n'est pas un probleme de flux reseaux car j'ai le meme souci en local et ma requete ne renvoi que 6000 lignes a tout casser)

  11. #11
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Et les colonnes que tu ajoutes dans ton SELECT proviennent de table un peu lointaines qui n'ont pas besoin d'être parcourues si tu n'affiches pas la colonne?

    Tu peux songer à plusieurs solutions :
    - ajouter des index sur les colonnes qui sont utilisées pour les JOIN les plus coûteux du plan d'exécution, si elles ne comporte pas déjà d'index
    - dénormaliser (avec précaution) pour copier les valeurs que tu veux rechercher dans les tables lointaines dans une table proche
    - faire une vue indexée... (attention aux contraintes que cela implique en terme d'options des connexions, notamment celles qui modifient les valeurs dans ces tables), si tu as une version entreprise de SQL Server.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  12. #12
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par rudib
    Et les colonnes que tu ajoutes dans ton SELECT proviennent de table un peu lointaines qui n'ont pas besoin d'être parcourues si tu n'affiches pas la colonne?
    J'ai lu et relus, je pige pas la question... mais j'ai systematiquement besoin d'une colonne au moin dans les tables que je balaye

    Citation Envoyé par rudib
    Tu peux songer à plusieurs solutions :
    - ajouter des index sur les colonnes qui sont utilisées pour les JOIN les plus coûteux du plan d'exécution, si elles ne comporte pas déjà d'index
    J'ai ajouté des index mais sans resultat dans l'immediat

    Citation Envoyé par rudib
    - dénormaliser (avec précaution) pour copier les valeurs que tu veux rechercher dans les tables lointaines dans une table proche
    Il n y a aucune relation implémenté dans le modele de données sous Entreprise Manager. (ni contrainte, ni cle primaire, ni cle etrangere)

    Citation Envoyé par rudib
    - faire une vue indexée... (attention aux contraintes que cela implique en terme d'options des connexions, notamment celles qui modifient les valeurs dans ces tables), si tu as une version entreprise de SQL Server.
    J'avoue que je n'ai pas essayé et nous disposons de la version Entreprise..

    Sans quoi la chose etrange est que la vue en elle meme est tres rapide (3 sec a peine) jusqu' a ce que l'on joingne (jointure externe gauche) d'autres vues.. (en tout quatre)

    Ces vues prises séparemment repondent toutes en 5/6 seconde et lorsque je l'ai ajoute, une a une a ma vue, mon temps de reponse augmente de maniere exponentielle


  13. #13
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Citation Envoyé par b_lob
    Il n y a aucune relation implémenté dans le modele de données sous Entreprise Manager. (ni contrainte, ni cle primaire, ni cle etrangere)
    Les contraintes n'ont pas besoin d'être déclarées. A partir du moment où tu utilises des JOIN dans tes requêtes, les relations sont évidemment résolues par la requête. Tu peux songer à dénormaliser si besoin est :
    http://www.developpez.net/forums/showthread.php?t=6231

    Citation Envoyé par b_lob
    Sans quoi la chose etrange est que la vue en elle meme est tres rapide (3 sec a peine) jusqu' a ce que l'on joingne (jointure externe gauche) d'autres vues.. (en tout quatre)

    Ces vues prises séparemment repondent toutes en 5/6 seconde et lorsque je l'ai ajoute, une a une a ma vue, mon temps de reponse augmente de maniere exponentielle
    Il est impossible de t'aider sans avoir le code des requêtes ou le plan d'exécution. C'est le plan d'exécution qui te donnera les indications dont tu as besoin pour connaître précisément la source du problème, et les colonnes à éventuellement indexer.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    Avant de dénormaliser il faut poser les BON index.
    Un index sur une colonne se sert à rien si l'info à trouver concerne une autre colonne.
    Il est nécessaire de réaliser des index couvrant dont la première colonne est celle utilisée comme critère de filtrage et si possible la plus discriminante.
    Si le volume est considérable et la requête fréquemment jouée, il peut s'avérer extrémement payant d'utiliser une vue indexée. Cela ramène fréquemment les performances dans un rapport de 1 à 1000 notamment si l'on a des calculs d'agrégats.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  15. #15
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Merci beaucoup pour votre aide !!!

    Les index que j'avais ajouté (cluster) couvraient bien les colonnes dont j'ai besoin. (Dans le plan d'execution, le table scan a ete remplacé par Index).
    la plupart des jointures se font sur le code client

    Je veux bien vous faire parvenir le plan d'execution mais j'ai encore beaucoup de lacune car en essayant de l'imprimer sur un PDF j'ai qu'une partie du plan (Si vous avez une meilleure idée)

  16. #16
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Tu peux poster le plan d'exécution en format texte. Pour l'obtenir :
    http://rudi.developpez.com/sqlserver...misation/#LI-B
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  17. #17
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    SET SHOWPLAN_TEXT ON => renvoie le plan de requête en mode text !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  18. #18
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    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
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
     
      |--Compute Scalar(DEFINE:([Expr1127]=rtrim(Convert([pref].[abr_prefcl]))+'  '+rtrim(Convert([part].[particule]))+'  '+rtrim(Convert([client].[nom]))+'  '+rtrim(Convert([client].[prenom]))))
           |--Hash Match(Right Outer Join, HASH:([reon].[num_reon])=([site].[num_reon]), RESIDUAL:([reon].[num_reon]=[site].[num_reon]))
                |--Table Scan(OBJECT:([spage].[dbo].[reon]))
                |--Hash Match(Right Outer Join, HASH:([agent].[cod_agent])=([cltaff].[agt_compta]), RESIDUAL:([agent].[cod_agent]=[cltaff].[agt_compta]))
                     |--Compute Scalar(DEFINE:([Expr1126]=rtrim(Convert([agent].[nom]))+'. '+substring(rtrim(Convert([agent].[prenom])), 1, 1)))
                     |    |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                     |--Hash Match(Right Outer Join, HASH:([agent].[cod_agent])=([cltaff].[int_expert]), RESIDUAL:([agent].[cod_agent]=[cltaff].[int_expert]))
                          |--Compute Scalar(DEFINE:([Expr1123]=rtrim(Convert([agent].[nom]))+'. '+substring(rtrim(Convert([agent].[prenom])), 1, 1)))
                          |    |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                          |--Hash Match(Right Outer Join, HASH:([agent].[cod_agent])=([cltaff].[int_viseur]), RESIDUAL:([agent].[cod_agent]=[cltaff].[int_viseur]))
                               |--Compute Scalar(DEFINE:([Expr1120]=rtrim(Convert([agent].[nom]))+'. '+substring(rtrim(Convert([agent].[prenom])), 1, 1)))
                               |    |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                               |--Hash Match(Right Outer Join, HASH:([PrevisionC].[cod_client], [PrevisionC].[dat_finexe], [PrevisionC].[num_exerci])=([cltexe].[cod_client], [cltexe].[dat_finexe], [cltexe].[num_exerci]), RESIDUAL:(([PrevisionC].[
                                    |--Clustered Index Scan(OBJECT:([CGA].[dbo].[PrevisionC].[IDXC_PrevisionC]))
                                    |--Hash Match(Right Outer Join, HASH:([TRAITC].[dat_finexe], [TRAITC].[cod_client])=([Expr1158], [cltexe].[cod_client]), RESIDUAL:([TRAITC].[dat_finexe]=[Expr1158] AND [cltexe].[cod_client]=[TRAITC].[cod_client])
                                         |--Compute Scalar(DEFINE:([Expr1117]=substring(Convert([agent].[prenom]), 1, 1)+'.'+[agent].[nom]))
                                         |    |--Filter(WHERE:([TRAITC].[dat_envoi]>[hist_fac].[date_t] OR [hist_fac].[date_t]=NULL))
                                         |         |--Nested Loops(Left Outer Join, WHERE:([hist_fac].[dossier]=[TRAITC].[cod_client] AND [hist_fac].[fin_ex]=[TRAITC].[dat_finexe]))
                                         |              |--Hash Match(Inner Join, HASH:([TRAITC].[demandeur])=([Expr1160]), RESIDUAL:([Expr1160]=[TRAITC].[demandeur]))
                                         |              |    |--Compute Scalar(DEFINE:([TRAITC].[cod_client]=[TRAITC].[cod_client], [TRAITC].[dat_envoi]=[TRAITC].[dat_envoi]))
                                         |              |    |    |--Top(1)
                                         |              |    |         |--Segment
                                         |              |    |              |--Sort(ORDER BY:([TRAITC].[cod_client] DESC, [TRAITC].[dat_envoi] DESC))
                                         |              |    |                   |--Table Scan(OBJECT:([CGA].[dbo].[TRAITC]), WHERE:([TRAITC].[dat_envoi]<>NULL))
                                         |              |    |--Compute Scalar(DEFINE:([Expr1160]=ltrim(Convert([agent].[cod_agent]))))
                                         |              |         |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                                         |              |--Table Spool
                                         |                   |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[date_t], [cltexe].[cod_client]))
                                         |                        |--Sort(ORDER BY:([hist_fac].[date_t] ASC, [hist_fac].[dossier] ASC))
                                         |                        |    |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[lot_trt], [cltexe].[cod_client]))
                                         |                        |         |--Sort(ORDER BY:([hist_fac].[lot_trt] ASC, [hist_fac].[dossier] ASC))
                                         |                        |         |    |--Hash Match(Inner Join, HASH:([cltexe].[cod_client])=([client].[cod_client]), RESIDUAL:([client].[cod_client]=[cltexe].[cod_client] AND (((([client].[num_marche]=1 AND
                                         |                        |         |         |--Hash Match(Inner Join, HASH:([hist_fac].[dossier], [hist_fac].[fin_ex])=([cltexe].[cod_client], [Expr1159]), RESIDUAL:([hist_fac].[dossier]=[cltexe].[cod_client] AND [
                                         |                        |         |         |    |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND ((([hist_fac].[lbra_n_nb]<>0 OR [hist_fac].[lbra_s_nb]<>0) OR [h
                                         |                        |         |         |    |--Compute Scalar(DEFINE:([Expr1159]=Convert([cltexe].[dat_finexe])))
                                         |                        |         |         |         |--Table Scan(OBJECT:([spage].[dbo].[cltexe]))
                                         |                        |         |         |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[nat_client]='C' AND ([client].[num_marche]=1 OR [client].[num_marche]=2)))
                                         |                        |         |--Row Count Spool
                                         |                        |              |--Filter(WHERE:([Expr1012]=[hist_fac].[lot_trt]))
                                         |                        |                   |--Stream Aggregate(DEFINE:([Expr1012]=MAX([hist_fac].[lot_trt])))
                                         |                        |                        |--Nested Loops(Inner Join, WHERE:(((([client].[num_marche]=1 AND [hist_fac].[lbra_n_nb]<>0) OR ([client].[num_marche]=1 AND [hist_fac].[lbra_s_nb]<>0)) OR ([clien
                                         |                        |                             |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[cltexe].[cod_client]) AND ((([hist
                                         |                        |                             |--Table Spool
                                         |                        |                                  |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[cltexe].[cod_client] AND ([client].[num_marche]=1 OR [client].[num_ma
                                         |                        |--Row Count Spool
                                         |                             |--Filter(WHERE:([Expr1007]=[hist_fac].[date_t]))
                                         |                                  |--Stream Aggregate(DEFINE:([Expr1007]=MAX([hist_fac].[date_t])))
                                         |                                       |--Nested Loops(Inner Join, WHERE:(((([client].[num_marche]=1 AND [hist_fac].[lbra_n_nb]<>0) OR ([client].[num_marche]=1 AND [hist_fac].[lbra_s_nb]<>0)) OR ([client].[num_ma
                                         |                                            |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[cltexe].[cod_client]) AND ((([hist_fac].[lbr
                                         |                                            |--Table Spool
                                         |                                                 |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[cltexe].[cod_client] AND ([client].[num_marche]=1 OR [client].[num_marche]=2)))
                                         |--Compute Scalar(DEFINE:([Expr1158]=Convert([cltexe].[dat_finexe])))
                                              |--Nested Loops(Left Outer Join, WHERE:(([hist_fac].[dossier]=[cltexe].[cod_client] AND [cltdev].[num_exerci]=[cltexe].[num_exerci]) AND [client].[nat_client]=[cltexe].[nat_client]))
                                                   |--Nested Loops(Left Outer Join, WHERE:(([cltcga].[cod_client]=[cltexe].[cod_client] AND [cltcga].[nat_client]=[cltexe].[nat_client]) AND [cltcga].[num_exerci]=[cltexe].[num_exerci]))
                                                   |    |--Nested Loops(Left Outer Join, WHERE:(([agtcra].[cod_client]=[cltexe].[cod_client] AND [agtcra].[nat_client]=[cltexe].[nat_client]) AND [agtcra].[num_exerci]=[cltexe].[num_exerci]))
                                                   |    |    |--Hash Match(Inner Join, HASH:([marche].[num_marche])=([site].[num_marche]), RESIDUAL:([site].[num_marche]=[marche].[num_marche]))
                                                   |    |    |    |--Table Scan(OBJECT:([spage].[dbo].[marche]))
                                                   |    |    |    |--Hash Match(Inner Join, HASH:([site].[num_marche], [site].[num_siteph])=([client].[num_marche], [siteph].[num_siteph]), RESIDUAL:([client].[num_marche]=[site].[num_marche]
                                                   |    |    |         |--Table Scan(OBJECT:([spage].[dbo].[site]))
                                                   |    |    |         |--Hash Match(Inner Join, HASH:([partic].[num_partic])=([client].[num_partic]), RESIDUAL:([partic].[num_partic]=[client].[num_partic]))
                                                   |    |    |              |--Table Scan(OBJECT:([spage].[dbo].[partic]))
                                                   |    |    |              |--Hash Match(Inner Join, HASH:([siteph].[num_siteph])=([equipe].[num_siteph]), RESIDUAL:([equipe].[num_siteph]=[siteph].[num_siteph]))
                                                   |    |    |                   |--Table Scan(OBJECT:([spage].[dbo].[siteph]))
                                                   |    |    |                   |--Hash Match(Inner Join, HASH:([prefcl].[num_prefcl])=([client].[num_prefcl]), RESIDUAL:([prefcl].[num_prefcl]=[client].[num_prefcl]))
                                                   |    |    |                        |--Table Scan(OBJECT:([spage].[dbo].[prefcl]))
                                                   |    |    |                        |--Hash Match(Inner Join, HASH:([equipe].[num_equipe])=([cltaff].[num_equipe]), RESIDUAL:([cltaff].[num_equipe]=[equipe].[num_equipe]))
                                                   |    |    |                             |--Table Scan(OBJECT:([spage].[dbo].[equipe]), WHERE:(Convert([equipe].[ok_arret])=0))
                                                   |    |    |                             |--Hash Match(Inner Join, HASH:([agent].[cod_agent])=([cltaff].[agt_compta]), RESIDUAL:([cltaff].[agt_compta]=[agent].[cod_agent]))
                                                   |    |    |                                  |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                                                   |    |    |                                  |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([client].[cod_client]), RESIDUAL:([cltorg].[cod_client]=[client].[cod_client]))
                                                   |    |    |                                       |--Table Scan(OBJECT:([spage].[dbo].[cltorg]), WHERE:(([cltorg].[num_orgclt]=14 AND [cltorg].[dat_effsor]>=getdate()) AND [cltorg].[nat_client]='C')
                                                   |    |    |                                       |--Hash Match(Inner Join, HASH:([client].[cod_client])=([cltorg].[cod_client]), RESIDUAL:([client].[cod_client]=[cltorg].[cod_client] AND (((((((((((([
                                                   |    |    |                                            |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[nat_client]='C' AND ([client].[num_marche]=1 OR [client].[num_marche]=2)))
                                                   |    |    |                                            |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([client].[cod_client]), RESIDUAL:([client].[cod_client]=[cltorg].[cod_client]))
                                                   |    |    |                                                 |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([cltaff].[cod_client]), RESIDUAL:([cltaff].[cod_client]=[cltorg].[cod_client]))
                                                   |    |    |                                                 |    |--Hash Match(Inner Join, HASH:([cltorg].[cod_client], [client].[nat_client])=([cltexe].[cod_client], [cltexe].[nat_client]), RESIDUAL:(
                                                   |    |    |                                                 |    |    |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([client].[cod_client]), RESIDUAL:([client].[cod_client]=[cltorg].[cod_clien
                                                   |    |    |                                                 |    |    |    |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([cltcom].[cod_client]), RESIDUAL:([cltcom].[cod_client]=[cltorg].[cod_
                                                   |    |    |                                                 |    |    |    |    |--Hash Match(Inner Join, HASH:([cltorg].[cod_client])=([cltcom].[cod_client]), RESIDUAL:([cltcom].[cod_client]=[cltorg].
                                                   |    |    |                                                 |    |    |    |    |    |--Table Scan(OBJECT:([spage].[dbo].[cltorg]), WHERE:(([cltorg].[num_orgclt]=14 AND [cltorg].[dat_effsor]>=getdate(
                                                   |    |    |                                                 |    |    |    |    |    |--Table Scan(OBJECT:([spage].[dbo].[cltcom]), WHERE:([cltcom].[dat_finsit]='déc 31 9999 12:00AM' AND [cltcom].[nat
                                                   |    |    |                                                 |    |    |    |    |--Table Scan(OBJECT:([spage].[dbo].[cltcom]), WHERE:([cltcom].[dat_finsit]='déc 31 9999 12:00AM' AND [cltcom].[nat_clie
                                                   |    |    |                                                 |    |    |    |--Table Scan(OBJECT:([spage].[dbo].[client]))
                                                   |    |    |                                                 |    |    |--Table Scan(OBJECT:([spage].[dbo].[cltexe]), WHERE:([cltexe].[dat_finexe]>'déc 31 2005 12:00AM' AND [cltexe].[nat_client]='C'))
                                                   |    |    |                                                 |    |--Table Scan(OBJECT:([spage].[dbo].[cltaff]), WHERE:([cltaff].[dat_finsit]='déc 31 9999 12:00AM' AND [cltaff].[nat_client]='C'))
                                                   |    |    |                                                 |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[nat_client]='C'))
                                                   |    |    |--Table Spool
                                                   |    |         |--Compute Scalar(DEFINE:([Expr1086]=substring(Convert([agent].[prenom]), 1, 1)+'.'+[agent].[nom]))
                                                   |    |              |--Nested Loops(Inner Join, WHERE:([agtcra].[cod_agent]=[agent].[cod_agent]))
                                                   |    |                   |--Sort(ORDER BY:([agtcra].[cod_client] ASC, [agtcra].[nat_client] ASC, [agtcra].[num_exerci] ASC))
                                                   |    |                   |    |--Filter(WHERE:([agtcra].[num_cra]=[Expr1045]))
                                                   |    |                   |         |--Stream Aggregate(GROUP BY:([Rank1162]) DEFINE:([Expr1045]=MAX([agtcra].[num_cra]), [agtcra].[num_cra]=ANY([agtcra].[num_cra]), [agtcra].[dat_cra]=ANY([agtcra].[d
                                                   |    |                   |              |--Sort(ORDER BY:([Rank1162] ASC))
                                                   |    |                   |                   |--Hash Match(Inner Join, HASH:([agtcra].[cod_client], [agtcra].[dat_cra])=([agtcra].[cod_client], [agtcra].[dat_cra]), RESIDUAL:([agtcra].[cod_client]=[g
                                                   |    |                   |                        |--Rank
                                                   |    |                   |                        |    |--Hash Match(Inner Join, HASH:([agtcra].[cod_client], [agtcra].[dat_cra], [agtcra].[num_exerci])=([agtcra].[cod_client], [Expr1042], [agtcra].[
                                                   |    |                   |                        |         |--Table Scan(OBJECT:([spage].[dbo].[agtcra]), WHERE:([agtcra].[num_activi]=6 AND [agtcra].[num_organi]=14))
                                                   |    |                   |                        |         |--Hash Match(Aggregate, HASH:([agtcra].[cod_client], [agtcra].[num_exerci]), RESIDUAL:([agtcra].[cod_client]=[agtcra].[cod_client] AND [ag
                                                   |    |                   |                        |              |--Table Scan(OBJECT:([spage].[dbo].[agtcra]))
                                                   |    |                   |                        |--Table Scan(OBJECT:([spage].[dbo].[agtcra]))
                                                   |    |                   |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                                                   |    |--Table Spool
                                                   |         |--Compute Scalar(DEFINE:([Expr1097]=substring(Convert([agent].[prenom]), 1, 1)+'.'+[agent].[nom]))
                                                   |              |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[date_t], [cltexe].[cod_client]))
                                                   |                   |--Sort(ORDER BY:([hist_fac].[date_t] ASC, [cltcga].[cod_client] ASC))
                                                   |                   |    |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[lot_trt], [cltexe].[cod_client]))
                                                   |                   |         |--Nested Loops(Inner Join, WHERE:([cltcga].[agt_revise]=[agent].[cod_agent]))
                                                   |                   |         |    |--Sort(ORDER BY:([hist_fac].[lot_trt] ASC, [cltcga].[cod_client] ASC))
                                                   |                   |         |    |    |--Hash Match(Inner Join, HASH:([cltexe].[cod_client])=([client].[cod_client]), RESIDUAL:([client].[cod_client]=[cltexe].[cod_client] AND (((([client].[num_mar
                                                   |                   |         |    |         |--Filter(WHERE:([Expr1029]=[cltcga].[dat_visa]))
                                                   |                   |         |    |         |    |--Stream Aggregate(GROUP BY:([Rank1177]) DEFINE:([Expr1029]=MAX([cltcga].[dat_visa]), [cltcga].[dat_visa]=ANY([cltcga].[dat_visa]), [cltcga].[agt_revi
                                                   |                   |         |    |         |         |--Sort(ORDER BY:([Rank1177] ASC))
                                                   |                   |         |    |         |              |--Hash Match(Inner Join, HASH:([cltexe].[cod_client], [cltexe].[num_exerci])=([cltcga].[cod_client], [cltcga].[num_exerci]), RESIDUAL:([cl
                                                   |                   |         |    |         |                   |--Rank
                                                   |                   |         |    |         |                   |    |--Hash Match(Inner Join, HASH:([cltexe].[cod_client], [cltexe].[num_exerci])=([cltcga].[cod_client], [cltcga].[num_exerci]), RESID
                                                   |                   |         |    |         |                   |         |--Hash Match(Inner Join, HASH:([hist_fac].[dossier], [hist_fac].[fin_ex])=([cltexe].[cod_client], [Expr1161]), RESIDUAL:([hist_fac]
                                                   |                   |         |    |         |                   |         |    |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[fin_ex]>'dé
                                                   |                   |         |    |         |                   |         |    |--Compute Scalar(DEFINE:([Expr1161]=Convert([cltexe].[dat_finexe])))
                                                   |                   |         |    |         |                   |         |         |--Table Scan(OBJECT:([spage].[dbo].[cltexe]))
                                                   |                   |         |    |         |                   |         |--Table Scan(OBJECT:([spage].[dbo].[cltcga]), WHERE:([cltcga].[num_associ]=0))
                                                   |                   |         |    |         |                   |--Table Scan(OBJECT:([spage].[dbo].[cltcga]))
                                                   |                   |         |    |         |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[nat_client]='C' AND ([client].[num_marche]=1 OR [client].[num_marche]=2)))
                                                   |                   |         |    |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                                                   |                   |         |--Row Count Spool
                                                   |                   |              |--Filter(WHERE:([hist_fac].[lot_trt]=[Expr1039]))
                                                   |                   |                   |--Stream Aggregate(DEFINE:([Expr1039]=MAX([hist_fac].[lot_trt])))
                                                   |                   |                        |--Nested Loops(Inner Join, WHERE:(((([client].[num_marche]=1 AND [hist_fac].[lbra_n_nb]<>0) OR ([client].[num_marche]=1 AND [hist_fac].[lbra_s_nb]<>0)) OR ([
                                                   |                   |                             |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[cltexe].[cod_client]) AND (((
                                                   |                   |                             |--Table Spool
                                                   |                   |                                  |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[cltexe].[cod_client] AND ([client].[num_marche]=1 OR [client].[n
                                                   |                   |--Row Count Spool
                                                   |                        |--Filter(WHERE:([hist_fac].[date_t]=[Expr1034]))
                                                   |                             |--Stream Aggregate(DEFINE:([Expr1034]=MAX([hist_fac].[date_t])))
                                                   |                                  |--Nested Loops(Inner Join, WHERE:(((([client].[num_marche]=1 AND [hist_fac].[lbra_n_nb]<>0) OR ([client].[num_marche]=1 AND [hist_fac].[lbra_s_nb]<>0)) OR ([client].[n
                                                   |                                       |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[cltexe].[cod_client]) AND ((([hist_fac]
                                                   |                                       |--Table Spool
                                                   |                                            |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[cltexe].[cod_client] AND ([client].[num_marche]=1 OR [client].[num_marche]
                                                   |--Table Spool
                                                        |--Compute Scalar(DEFINE:([Expr1106]=substring([agent].[prenom], 1, 1)+'.'+[agent].[nom]))
                                                             |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[lot_trt], [client].[cod_client]))
                                                                  |--Sort(ORDER BY:([hist_fac].[lot_trt] ASC, [hist_fac].[dossier] ASC))
                                                                  |    |--Nested Loops(Inner Join, OUTER REFERENCES:([hist_fac].[date_t], [client].[cod_client]))
                                                                  |         |--Sort(ORDER BY:([hist_fac].[date_t] ASC, [hist_fac].[dossier] ASC))
                                                                  |         |    |--Hash Match(Inner Join, HASH:([hist_fac].[comptable])=([agent].[cod_agent]), RESIDUAL:([hist_fac].[comptable]=[agent].[cod_agent]))
                                                                  |         |         |--Hash Match(Inner Join, HASH:([cltdev].[cod_client])=([client].[cod_client]), RESIDUAL:([client].[cod_client]=[cltdev].[cod_client] AND (((([client].[num_marche]=
                                                                  |         |         |    |--Hash Match(Inner Join, HASH:([hist_fac].[dossier], [hist_fac].[fin_ex])=([cltdev].[cod_client], [cltdev].[dat_findev]), RESIDUAL:([hist_fac].[dossier]=[cltdev].
                                                                  |         |         |    |    |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND (([hist_fac].[rbra_nb]<>0 OR [hist_fac].[cga_nb]<>0) OR [hi
                                                                  |         |         |    |    |--Table Scan(OBJECT:([spage].[dbo].[cltdev]), WHERE:((([cltdev].[mont_to_e]<>0.00 AND [cltdev].[nat_client]='C') AND [cltdev].[num_avenan]='00') AND (((
                                                                  |         |         |    |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[nat_client]='C' AND ([client].[num_marche]=1 OR [client].[num_marche]=2)))
                                                                  |         |         |--Table Scan(OBJECT:([spage].[dbo].[agent]))
                                                                  |         |--Row Count Spool
                                                                  |              |--Filter(WHERE:([Expr1019]=[hist_fac].[date_t]))
                                                                  |                   |--Stream Aggregate(DEFINE:([Expr1019]=MAX([hist_fac].[date_t])))
                                                                  |                        |--Hash Match(Inner Join, HASH:([cltdev].[dat_findev])=([hist_fac].[fin_ex]), RESIDUAL:([hist_fac].[fin_ex]=[cltdev].[dat_findev] AND (((([client].[num_marche]=1 A
                                                                  |                             |--Nested Loops(Inner Join)
                                                                  |                             |    |--Table Scan(OBJECT:([spage].[dbo].[cltdev]), WHERE:((([cltdev].[mont_to_e]<>0.00 AND [cltdev].[cod_client]=[client].[cod_client]) AND [cltdev].[
                                                                  |                             |    |--Table Spool
                                                                  |                             |         |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[client].[cod_client] AND ([client].[num_marche]=1 OR [client].[n
                                                                  |                             |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[client].[cod_client]) AND (([hist_
                                                                  |--Row Count Spool
                                                                       |--Filter(WHERE:([Expr1026]=[hist_fac].[lot_trt]))
                                                                            |--Stream Aggregate(DEFINE:([Expr1026]=MAX([hist_fac].[lot_trt])))
                                                                                 |--Hash Match(Inner Join, HASH:([cltdev].[dat_findev])=([hist_fac].[fin_ex]), RESIDUAL:([hist_fac].[fin_ex]=[cltdev].[dat_findev] AND (((([client].[num_marche]=1 AND (([cl
                                                                                      |--Nested Loops(Inner Join)
                                                                                      |    |--Table Scan(OBJECT:([spage].[dbo].[cltdev]), WHERE:((([cltdev].[mont_to_e]<>0.00 AND [cltdev].[cod_client]=[client].[cod_client]) AND [cltdev].[num_avenan
                                                                                      |    |--Table Spool
                                                                                      |         |--Table Scan(OBJECT:([spage].[dbo].[client]), WHERE:([client].[cod_client]=[client].[cod_client] AND ([client].[num_marche]=1 OR [client].[num_marche]
                                                                                      |--Table Scan(OBJECT:([spage].[dbo].[hist_fac]), WHERE:(([hist_fac].[fin_ex]>'déc 31 2005 12:00AM' AND [hist_fac].[dossier]=[client].[cod_client]) AND (([hist_fac].[rbra

  19. #19
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Je réouvre un message car le precedent dépassait les 30000 caratères autorisés.

    Donc !

    Ok, j'ai lu l'article sur la dénormalisation et je comprend mieux. Avant par denormalisation, j'entendais "suppression de contraintes d'integritées referentielles" mais c'est tout autre chose.

    Hélàs, je ne peux en rien modifier ni influer sur la dénormalisation de la base de données meme si des taux de dispertion peuvent le justifier. (A noter que je ne sais pas a quoi correspond une table faiblement, moyennement ou fortement populée en terme de ligne)


    ci dessus vous trouverez le plan d'execution mais il est assez rude.. enfin qu'en pensez vous ?

  20. #20
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    Presque tous les accès aux données se font par des balayage de table (feuilles de l'arbre du plan de requête). C'est ce qu'il y a de pire. Aucun de vos index ne sert donc réellement.
    Posez-vous les questions suivantes :
    1) voulez-vous toutes les colonnesinscrites dans votre clause SELECT ?
    2) pouvez-vous poser des index couvrants ?
    3) ne pouvez-vous pas passer par une vue indexée ? (soit en totalité soit dans un niveau intermédiaire ?)

    Pour finir je vous conseille de suivre une formation sur l'optimisation de MS SQL Server... Par exemple celles que je donne à Orsys ou Learning Tree...
    http://www.learningtree.fr/courses/535pf.htm
    http://www.orsys.fr/pdfCours/SQO.pdf...ation%20sqo%22

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. [MySQL] grosse requete qui ferait tout planter ?
    Par mdr_cedrick dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 29/01/2008, 17h25
  2. Message d'erreur lors d'une grosse requete
    Par tony8716 dans le forum Développement
    Réponses: 9
    Dernier message: 03/01/2008, 10h34
  3. Message d'erreur lors d'une grosse requete
    Par tony8716 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 03/01/2008, 10h34
  4. Plusieurs Sous-Requete lenteur exécution
    Par Pago dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/09/2007, 13h58
  5. Grosse Requete ou Requete sur une vue ?
    Par TangoZoulou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 20/07/2007, 09h52

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