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 :

Problème performance sur une jointure


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut Problème performance sur une jointure
    Bonjour,

    J'ai un problème de performance (plus de 10 minutes) sur une jointure, et je pense que ma super optimisé mais la je n'ai plus vraiment d'idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select w.ID1,  t.ID2, CONVERT(DATE, t.Date) AS Date, COUNT(*) AS Number
    from TABLE1 w
    left join TABLE2 t on w.ID=t.SendingParticipant
    GROUP BY t.ID2, CONVERT(DATE, t.Date), w.ID
    En sachant que table 1 j'ai à peu près 35000 records
    Et dans la table 2 j'ai 3,000,000 de records

    En sachant si je fais uniquement le requête ci-dessous cela me retourne 2979 records en moins de 2 secondes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID2, CONVERT(DATE, Date) AS Date, COUNT(*) AS Number
    FROM TABLE2
    GROUP BY ID2, CONVERT(DATE, Date)
    Et si je fais je fais cette requête sur la table 1 cela me retourne 183 records en moins de 2 secondes. Et en sachant que tous les ID1=ID2 exception faites de 4 ou 5 qui ne sont présent que dans la table1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct(ID1) from table1
    Voila si quelqu'un peut m'aider j'apprécierai beaucoup.

    Merci par avance.

    David

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Quel SGBD ?
    Quel est le plan d'execution ?
    Est-ce qu'on peut voir la définition de tes tables, et de indexes ?

    Tatayo.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 802
    Points
    30 802
    Par défaut
    Première question à se poser : y a-t-il un index sur les colonnes utilisées dans la jointure pour chacune des tables ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    je suis sur SQL Server 2008.

    Sinon au niveau des index aucun sur la table2 (3 millions de records) et un
    index sur la table1 sur ID1 et sur d'autres champs que je n'utilise pas sur la requête.

    J'ai fait le choix de ne pas mettre d'index sur la table2 pour des questions de performance lors de l'insertion cela à un sens ?

    Pour vous envoyer le plan d'exécution comment je fais?

    Merci

    David

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Votre table2 est une table de travail ?

    Si ca n'est pas le cas, quelques index dessus seront les bienvenus.

    Si c'est effectivement une table de travail, des tests pour savoir ce que vous coute un index lors du vidage / remplissage de celle-ci me sembleraient plus judicieux que de partir tout de suite sur le postulat : un seul index va me foutre en l'air les perfs

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Pas d'index sur 3 millions de lignes = requêtes en lecture très lentes !

    Avec SQL Server, je ne pense pas qu'il y ait de gros problèmes avec les insertions à cause des index, même avec 3 millions de lignes. Au pire, tu peux désactiver temporairement les index lors des insertions et les réactiver après.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Je pense que je me complique un peu trop, car après réflexion je ne pense pas qu'il soit nécessaire d’utiliser une autre table.

    La structure de ma table est la suivante

    Entite1 Entite2 Date Valeurs
    Toto Tata 01/01/2011 300
    Tete Toto 01/01/2011 600
    Toto Tete 01/01/2011 250

    je souhaiterai avoir comme résultat de ma requête

    Entite Date Valeurs
    Toto 01/01/2011 550
    Tete 01/01/2011 600
    Tata 01/01/2011 0

    Merci

    David

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre exemple n'est probablement pas suffisamment précis pour répondre à tous les cas de figure, néanmoins voici une base de départ :
    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
    With MaTable (Entite1, Entite2, Date, Valeurs) as -- Vos données
    (
    select 'Toto', 'Tata', '01/01/2011', 300 union all
    select 'Tete', 'Toto', '01/01/2011', 600 union all
    select 'Toto', 'Tete', '01/01/2011', 250
    )
      ,  SR (Entite, Date) as
    (
    select Entite1, Date from MaTable
     union
    select Entite2, Date from MaTable
    )
      select SR.Entite, SR.Date, coalesce(sum(MT.Valeurs), 0) as Valeurs
        from SR
             left outer join MaTable as MT
               on MT.Entite1 = SR.Entite
              AND MT.Date    = SR.Date
    group by SR.Entite, SR.Date
     
    Entite Date       Valeurs
    ------ ---------- -----------
    Tata   01/01/2011 0
    Tete   01/01/2011 600
    Toto   01/01/2011 550

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Merci Fabien pour ta réponse désolé mais je ne comprends pas très bien la 1ère partie de ton code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    WITH MaTable (Entite1, Entite2, Date, Valeurs) AS -- Vos données
    (
    SELECT 'Toto', 'Tata', '01/01/2011', 300 union ALL
    SELECT 'Tete', 'Toto', '01/01/2011', 600 union ALL
    SELECT 'Toto', 'Tete', '01/01/2011', 250
    )
      ,  SR (Entite, Date) AS
    David

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 774
    Points : 52 747
    Points
    52 747
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par chicken92000 Voir le message
    Sinon au niveau des indexe aucunes sur la table2 (3 millions de records) et un
    indexe sur la table1 sur ID1 et sur d'autres champs que je n'utilise pas sur la requête.

    J'ai fait le choix de ne pas mettre d'index sur la table2 pour des questions de performance lors de l'insertion cela à un sens ?
    Désolé de le dire aussi crument, mais c'est d'une haute stupidité !
    En effet les index sont nécessaire aussi bien pour les lecture que pour les écritures !!! En effet tout ordre SQL d'écriture commence par une lecture positionnelle pour savoir ou insérer. Sans index vous faites donc une lecture complete de la table à chaque insertion !!!!

    On se demande parfois ou les gens vont pêcher de telles imbécilités comme mettre des index c'est mal...
    Que serait une SGBDR sans index ni contraintes ? Un simple fichier Cobol !!!!

    Maintenant sur l'indexation de ces tables , faites ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE TABLE2 ADD CONSTRAINT PK PRIMARY KEY (ID2);
    si cela ne passe pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE CLUSTERED INDEX X_21 ON TABLE2 (ID2)
    SI cela ne passe toujours pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE CLUSTERED INDEX X_21 ON TABLE2 (ID2)
    et enfin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X_22 ON TABLE2  (SendingParticipant, "Date")
    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/ * * * * *

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 56
    Points : 29
    Points
    29
    Par défaut
    Bonjour,

    Merci de votre réponse et désolé si mes question sont "très stupides" et de t'avoir énervé ...

    Par rapport à tes suggestions, je ne pense pas pouvoir utiliser ces colonnes car les valeurs ne sont pas uniques.

    David

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    La première partie du code c'est simplement pour simuler votre jeu de données.

  13. #13
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Ton topic est'il résolu?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

Discussions similaires

  1. Problème sur une jointure, enfin je crois
    Par zooffy dans le forum Développement
    Réponses: 6
    Dernier message: 07/02/2009, 11h44
  2. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  3. Problèmes de performances sur une base oracle 10g
    Par ORAMEL dans le forum Oracle
    Réponses: 3
    Dernier message: 11/09/2007, 09h11
  4. Problème de performance sur une "grosse" BD
    Par frechy dans le forum Installation
    Réponses: 9
    Dernier message: 19/09/2005, 16h52
  5. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55

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