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

Requêtes PostgreSQL Discussion :

Optimisation d'une requête sql


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Optimisation d'une requête sql
    Bonjour ,

    actuellement je crée une application en entreprise , sur mon serveur local le temps d'affichage de mon interface est rapide car au niveau de ma base postgresql n'y a pas beaucoup de données . à la mise en production de mon application l'interface prend environs 3 min pour être affiché ,car au niveau de ma requête je récupère les données des 12 derniers moi et ya énormément de données en production .
    S'il vous plait quelqu'un pourrai m'aider à optimiser ma requête .
    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
    SELECT SUM(tmp.nombre) as somme, tmp.date as date FROM (
    (SELECT count(*) as nombre, to_char(datecreation, 'YYYY-MM') as date FROM archive WHERE idann IN (SELECT idann FROM annonce an WHERE (opem, opta) IN (    
        SELECT DISTINCT opem, opta FROM annonce an 
    WHERE statut = 'OK' AND dateannonce < date_trunc('month', CURRENT_DATE) 
    AND dateannonce > date_trunc('month', CURRENT_DATE -360) - INTERVAL '1' MONTH) 
    AND typeoperation = 'REAPTG' AND statut = 'OK' AND dateannonce < date_trunc('month', CURRENT_DATE) 
    AND dateannonce > date_trunc('month', CURRENT_DATE -360) - INTERVAL '1' MONTH 
    AND opta <> 'APNF00' AND opem <> 'APNF00') 
    AND  datecreation > current_date -360 GROUP BY to_char(datecreation, 'YYYY-MM'))
    UNION(SELECT count(*) as nombre, to_char(datecreation, 'YYYY-MM') as date FROM archive_longue WHERE idann IN (    
        SELECT idann FROM annonce an WHERE (opem, opta) IN (    
        SELECT DISTINCT opem, opta FROM annonce an WHERE statut = 'OK' 
    AND dateannonce < date_trunc('month', CURRENT_DATE) AND dateannonce > date_trunc('month', CURRENT_DATE -360) - INTERVAL '1' MONTH) 
    AND typeoperation = 'REAPTG'
     AND statut = 'OK' 
    AND dateannonce < date_trunc('month', CURRENT_DATE)
     AND dateannonce > date_trunc('month', CURRENT_DATE -360) - INTERVAL '1' MONTH AND opta <> 'APNF00' AND opem <> 'APNF00') AND  datecreation > current_date -360 GROUP BY to_char(datecreation, 'YYYY-MM'))) as tmp GROUP BY tmp.date ORDER BY 2,1 desc;
    Merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    1) remplacez UNION ALL à la place de UNION (si les deux tables ARCHIVE et archive_longue ne se recoupent pas au niveau des données)
    2) DISTINCT ne sert à rien dans une sous requête introduite par IN
    3) remplacez le To_char(datecreation, 'YYYY-MM') par l'extraction des années et mois en 2 colonnes de type entier
    4) si la colonne Statut ne contient que deux valeurs la remplacer par un booléen
    5) remontez le critère d'exclusion (AND opta <> 'APNF00' AND opem <> 'APNF00') dans la sous requête initiale (si c'est possible)
    6) utilisez une CTE pour factoriser les sous requêtes identiques (je n'ai pas appliqué toutes les 5 premières recommandations) :

    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
    WITH
    TA AS
    (SELECT opem, opta
     FROM   annonce an
     WHERE  statut = 'OK'
       AND  dateannonce < Date_trunc('month', current_date)
       AND  dateannonce > Date_trunc('month', current_date - 360)),
    TB AS
    (SELECT idann
     FROM   annonce an
     WHERE  ( opem, opta ) IN (SELECT opem, opta FROM TA)
       AND  typeoperation = 'REAPTG'
       AND  statut = 'OK'
       AND  dateannonce < Date_trunc('month',
                       current_date)
       AND  dateannonce > Date_trunc('month',
                       current_date - 360) -
                       interval '1' month
       AND  opta <> 'APNF00'
       AND  opem <> 'APNF00'),
    TC AS
    (SELECT Count(*)  AS nombre,
            To_char(datecreation, 'YYYY-MM') AS date
     FROM   ARCHIVE
     WHERE  idann IN (SELECT idann FROM TB)
       AND  datecreation > current_date - 360
     GROUP  BY To_char(datecreation, 'YYYY-MM')
     UNION ALL
     SELECT Count(*)  AS nombre,
            To_char(datecreation, 'YYYY-MM') AS date
     FROM   archive_longue
     WHERE  idann IN (SELECT idann FROM TB)
       AND  datecreation > current_date - 360
     GROUP  BY To_char(datecreation, 'YYYY-MM'))
    SELECT SUM(tmp.nombre) AS somme,
           tmp.DATE        AS date
    FROM   TC
    GROUP  BY tmp.DATE
    ORDER  BY 2, 1 DESC;
    Au niveau du modèle, remplacez la colonne typeoperation par un code_operation associée à une table de références des types d'iopération. De même pour OPTA/OPTEM.

    Au niveau admin, créez les index suivants s'ils n'exitent pas déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE INDEX X1 ON annonce (statut, dateannonce) 
    --ou 
    CREATE INDEX X1 ON annonce (statut, dateannonce, opem, opta)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X2 ON annonce (opem, opta, typeoperation, statut, dateannonce, idann)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X3 ON ARCHIVE (idann, datecreation)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X4 ON ARCHIVE (idann, datecreation)
    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/ * * * * *

  3. #3
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    En plus des suggestions de SQLpro, je pense qu'on peut créer une vue matérialisée et l'actualiser au 1er de chaque mois. Mais si des modifications sont permises sur les données antérieurs au mois courant il faut un trigger sur les tables concernées.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Essayez :

    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
    WITH
    TA AS
    (SELECT idann
     FROM   annonce an
     WHERE  statut = 'OK'
       AND  dateannonce < Date_trunc('month', current_date)
       AND  dateannonce > Date_trunc('month', current_date - 360)
       AND  opta <> 'APNF00'
       AND  opem <> 'APNF00'
       AND  typeoperation = 'REAPTG'
       AND  statut = 'OK'),
    TC AS
    (SELECT Count(*)  AS nombre,
            EXTRACT(YEAR FROM datecreation) AS Y, EXTRACT(MONTH FROM datecreation) AS M 
     FROM   ARCHIVE
     WHERE  idann IN (SELECT idann FROM TA)
       AND  datecreation > current_date - 360
     GROUP  BY EXTRACT(YEAR FROM datecreation) AS Y, EXTRACT(MONTH FROM datecreation) AS M 
     UNION ALL
     SELECT Count(*)  AS nombre,
            EXTRACT(YEAR FROM datecreation) AS Y, EXTRACT(MONTH FROM datecreation) AS M 
     FROM   archive_longue
     WHERE  idann IN (SELECT idann FROM TA)
       AND  datecreation > current_date - 360
     GROUP  BY EXTRACT(YEAR FROM datecreation) AS Y, EXTRACT(MONTH FROM datecreation) AS M )
    SELECT SUM(tmp.nombre) AS somme,
           Y, M
    FROM   TC
    GROUP  BY Y, M
    ORDER  BY 2, 1 DESC;
    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/ * * * * *

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Re
    Merci pour vos réponse ,SQLpro votre requête me donne le même résultat que la requête que j'ai posté le seule problème est que la date je l'utilise pour un test au niveau de ma classe java dans ce cas il me fallait l'année et le mois au même temps c'est pour ça que j'ai utilisé le to_char avec le extract(year_month) ne marche pas

  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 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    Mais ça c'est de la cosmétique et on s'en bât les c.... C'est à vous d'adapter votre code java au résultat de la requête et non au SGBDR de faire quelque chose pour lequel il n'est pas fait !!!!

    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] Optimisation d'une requête SQL
    Par PIEPLU dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 19/03/2011, 15h22
  2. Lecture et optimisation d'une requête SQL
    Par jbrasselet dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/10/2007, 15h34
  3. Optimisation d'une requête SQL
    Par Michel601 dans le forum Oracle
    Réponses: 3
    Dernier message: 08/03/2007, 15h17
  4. Optimisation d'une requête SQL
    Par gaboo_bl dans le forum Oracle
    Réponses: 18
    Dernier message: 23/10/2006, 15h33
  5. [MySQL] Optimisation d'une requête sql
    Par fabien14 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 18/09/2006, 11h45

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