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

Langage SQL Discussion :

Optimisation requête SQL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 221
    Par défaut Optimisation requête SQL
    Bonjour à tous,

    Je bosses actuellement sur l'optimisation d'une requête SQL dont les principales instructions sont listées ci-dessous:

    Code sql : 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
     
      create table work.perim_rev4 as
          select
             rev3.e_date,
             rev3.c_c_mef,
             rev3.c_c_creat,
             rev3.c_c_dele_mef,
        		 d_noms_r_h.d_forc as d_forc
          from
             input_rev3 rev3 
          left join 
             d_noms_r_histo
                on
                (
                   rev3.sic_id =d_noms_r_histo.sic_id
                )
          group by
             rev3.sic_id
          having
             rev3.even_rang = max(rev3.even_rang);
    Cette requête met beaucoup de temps à s’exécuter et j'aimerais savoir comment procéder pour réduire les temps de traitements. Est il judicieux de créer une table intermédiaire dans laquelle je pourrais grouper les rev3.sic_id et ne retenir que le max(rev3.even_rang) ?

    A titre de rappel on peut avoir plusieurs even_date pour le même sic_id et le but est de conserver le dernier (le max) even_date.

    Merci d'avance

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    A titre de rappel on peut avoir plusieurs even_date pour le même sic_id et le but est de conserver le dernier (le max) even_date.
    Votre requête ne fait pas ca. (edit : si j’interprète bien ce code ..)

    Je suppose que vous êtes sous MySql ?

    La règle de base du group by est : Toute colonne non présente dans la clause du group by doit être encadrée par une fonction d'agrégation (min, max , etc) dans la clause SELECT.


    Donc déjà reformons la requête (avec certaines suppositions vu que vous n'avez pas présenté vos tables ni les relations entre elles) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT b.e_date,
    	b.c_c_mef,
            b.c_c_creat,
            b.c_c_dele_mef,
        	d_noms_r_h.d_forc AS d_forc
    FROM (
    	SELECT SIC_ID, MAX(EVEN_RANG) as max_rng
    	FROM input_rev3 
    	GROUP BY SIC_ID) AS A
    INNER JOIN input_rev3 B ON A.SIC_ID = B.SIC_ID AND A.MAX_RNG = B.EVEN_RANG
    LEFT OUTER JOIN d_noms_r_histo ON rev3.sic_id =d_noms_r_histo.sic_id
    Ensuite pour la rapidité il faudra un index sur le couple : input_rev3(SIC_ID, EVEN_RANG)

    Et un autre sur d_noms_r_histo(sic_id)



    Avec ça, si ca ne marche toujours pas revenez

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    voici une simplification possible :

    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
    CREATE TABLE work.perim_rev4 AS
    WITH T AS
    (SELECT rev3.sic_id , max(even_rang) AS even_rang
     FROM   input_rev3 AS rev3 
            LEFT OUTER JOIN d_noms_r_histo 
                 ON rev3.sic_id =d_noms_r_histo.sic_id
     GROUP BY rev3.sic_id)
    SELECT r3.e_date,
           r3.c_c_mef,
           r3.c_c_creat,
           r3.c_c_dele_mef,
           r3.d_noms_r_h.d_forc
    FROM   input_rev3 AS r3    
           INNER JOIN T  
                 ON r3.sic_id = T.sic_id;
    mais sans le DDL de vos tables et des index, impossible de vous aider plus...

    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. Optimisation requête SQL
    Par ludo00002 dans le forum SQL
    Réponses: 2
    Dernier message: 06/10/2008, 09h01
  2. Comment optimiser requête SQL avec création Index
    Par schumi101 dans le forum SQL
    Réponses: 25
    Dernier message: 11/12/2007, 21h28
  3. optimisation requête SQL
    Par marti dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2006, 08h54
  4. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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