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

Développement SQL Server Discussion :

Optimisation de requête [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Optimisation de requête
    Bonjour tout le monde,

    Une fois de plus je viens quérir votre aide.

    Cette fois-ci c'est sur une potentielle optimisation de requête.

    En gros j'arrive à faire mon extraction de données (je dois encore validé ces dernières mais je pense être bon). Ci-dessous la requête en question, selon l'année du sinistre, elle s'exécute entre 2 et 4 secondes pour me fournir entre 140 000 et 213 000 lignes de résultats.

    Je me disais qu'il y avait certainement moyen d’accélérer le traitement. Après si vous pensez que non, tant pis hein je ,patienterais les quelques secondes nécessaires !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select sis.Sin_Client_id, gad.Adr_Nom, ccl.Cli_Dossier_id, ppc.Pol_Contrat, pab.Bra_Intitule, sis.Sin_Annee, sis.Sin_SinistreCabinet
    from dbo.SI_Sinistres sis , dbo.PP_Contrats ppc, dbo.PA_Branches pab, dbo.PC_Clients ccl, dbo.PG_Adresses gad
    where sis.Sin_Annee ='2012'
    and sis.Sin_Client_id =ppc.Pol_client_id  --'9509' Pour test, rester sur une selection de tous les ID client par la suite
    and ppc.Pol_Branche_id = pab.Bra_Branche_id
    and ppc.Pol_client_id = ccl.Cli_Client_id
    and ccl.Cli_Adresse_id = gad.Adr_Adresse_id
    and ccl.Cli_Groupe_id is NULL

    Merci par avance pour vos réponses !

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    L'expression de la requête est propre, donc il nous faudrait le plan de requête réel pour voir ce que l'on peut faire.

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Récrivez votre requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select sis.Sin_Client_id, gad.Adr_Nom, ccl.Cli_Dossier_id, ppc.Pol_Contrat, 
           pab.Bra_Intitule, sis.Sin_Annee, sis.Sin_SinistreCabinet
    from   dbo.SI_Sinistres sis 
           JOIN dbo.PP_Contrats ppc
    	     ON sis.Sin_Client_id =ppc.Pol_client_id
    	   JOIN dbo.PA_Branches pab
    	     ON ppc.Pol_Branche_id = pab.Bra_Branche_id
    	   JOIN dbo.PC_Clients ccl
    	     ON ppc.Pol_client_id = ccl.Cli_Client_id
    	   JOIN dbo.PG_Adresses gad
    	     ON  ccl.Cli_Adresse_id = gad.Adr_Adresse_id
    where sis.Sin_Annee ='2012' 
    and ccl.Cli_Groupe_id is NULL
    La syntaxe des jointures dans la clause where est une hérésie en plus de faire perdre du temps à l'optimiseur

    Avec vous, au minimum, les index suivants :
    -- index sur sis avec Sin_Client_id, Sin_Annee include Sin_SinistreCabinet
    -- index sur ccl avec Cli_Client_id, Cli_Adresse_id, Cli_Groupe_id Include Cli_Dossier_id
    ?

    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/ * * * * *

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Merci pour vos réponses !

    En pj je mets le plan de requête comme demandé.

    Concernant cette demande :

    Avec vous, au minimum, les index suivants :
    -- index sur sis avec Sin_Client_id, Sin_Annee include Sin_SinistreCabinet
    -- index sur ccl avec Cli_Client_id, Cli_Adresse_id, Cli_Groupe_id Include Cli_Dossier_id


    Les index sont posés sur :

    - Sin_Sinistres_id (table dbo.SI_Sinistres)
    - Cli_Client_id (table dbo.PC_Clients)

    Je suppose que c'est une des raisons qui fait que le traitement est plus long ?
    Fichiers attachés Fichiers attachés

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Avec vous, au minimum, les index suivants :
    -- index sur sis avec Sin_Client_id, Sin_Annee include Sin_SinistreCabinet
    J'aurai mis sin_annee en première colonne de l'index !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    J'aurai mis sin_annee en première colonne de l'index !
    AMHA pas assez discriminant, donc problème de distribution statistique

    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/ * * * * *

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par mogway95 Voir le message
    Merci pour vos réponses !

    En pj je mets le plan de requête comme demandé.

    Concernant cette demande :

    Avec vous, au minimum, les index suivants :
    -- index sur sis avec Sin_Client_id, Sin_Annee include Sin_SinistreCabinet
    -- index sur ccl avec Cli_Client_id, Cli_Adresse_id, Cli_Groupe_id Include Cli_Dossier_id


    Les index sont posés sur :

    - Sin_Sinistres_id (table dbo.SI_Sinistres)
    - Cli_Client_id (table dbo.PC_Clients)

    Je suppose que c'est une des raisons qui fait que le traitement est plus long ?
    Dans votre plan de requête en PJ il est clair que tout est fait en SCAN de table (Analyse d'index clsuter = SCAN de Table) ce qui est le pus lent. Construisez au moins les 2 index que je vous ait indiqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE INDEX X_20160915_Sinistre_001 
       ON dbo.SI_Sinistres (Sin_Client_id, Sin_Annee)
       INCLUDE (Sin_SinistreCabinet)
       WITH (FILLFACTOR = 90);
    GO
     
    CREATE INDEX X_20160915_Client_001 
       ON dbo.PC_Clients (Cli_Client_id, Cli_Adresse_id, Cli_Groupe_id)
       INCLUDE (Cli_Dossier_id)
       WITH (FILLFACTOR = 90);
    GO
    Et testez... Si cela ne vous plait pas, détruisez les !

    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/ * * * * *

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Merci beaucoup pour votre réactivité à tous !

    Je test tout ça :p

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    C'est tout bon !

    Merci encore !

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

Discussions similaires

  1. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  2. Optimisation de requête avec Tkprof
    Par stingrayjo dans le forum Oracle
    Réponses: 3
    Dernier message: 04/07/2005, 09h50
  3. Optimiser une requête SQL d'un moteur de recherche
    Par kibodio dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/03/2005, 20h55
  4. optimisation des requêtes
    Par yech dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/09/2004, 19h03
  5. Optimisation de requête
    Par olivierN dans le forum SQL
    Réponses: 10
    Dernier message: 16/12/2003, 10h09

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