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 :

Blocage pour une requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut Blocage pour une requête
    Bonjour

    J'ai un gros soucis pour développer une requête car je ne sais pas comment m'y prendre un comble
    Je m'explique:
    j'ai dans ma base une liste de sauvegarde effectuée sur un ensemble de serveur.
    Cette sauvegarde peut être complète ou incrémentale.
    Cela correspond dans ma base à deux sauvegardes indépendantes.
    je dois lister les serveurs qui ne possèdent que des sauvegardes complètes.
    Ceux qui possèdent des complètes et incrémentales et ceux qui ne possèdent que des incrémentales car non utilisable et ne prendre que la dernière.
    J'ai testé en passant par une table temporaire mais le temps de réponse est très médiocre (17 min pour récupérer 4000 enregistrements.)
    Avez-vous des idées?
    D'avance merci pour votre aide
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  2. #2
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Complément d'information
    Structure de mes deux tables utilisées dans ma requetes
    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
    CREATE TABLE strategies
    (
      id_strat integer NOT NULL,
      id_serv integer,
      id_cata smallint,
      module character varying(85),
      type_strat character varying(3),
      strategie character varying(1),
      periode integer,
      classes character varying(8192),
      id_jeu integer,
      id_jeu2 integer,
      rejet character varying(8192),
      selection character varying(8192),
      type_module character varying(40),
      compress smallint,
      multiplex smallint,
      pre_trt character varying(256),
      post_trt character varying(256),
      reprise smallint,
      reprise_t interval,
      "interval" integer,
      objets integer,
      instances integer,
      occup_mo integer,
      occup_pct integer,
      en_service smallint,
      existe smallint,
      force_periode smallint,
      ctrl_absence smallint,
      id_user smallint,
      volume_mo integer,
      moyenne_mo integer,
      volume_mo_pre integer,
      frequence_pre interval,
      objets_pre integer,
      vol_disk_mo_pre integer,
      occup_mo_pre integer,
      periode_pre integer,
      periode_ctrl integer,
      CONSTRAINT strategies_pkey PRIMARY KEY (id_strat),
      CONSTRAINT ifserv FOREIGN KEY (id_serv)
          REFERENCES serveurs (id_serv) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE CASCADE
    )
    WITH OIDS;
    CREATE INDEX strategies_idx
      ON strategies
      USING btree
      (module, type_module, id_cata, id_serv);
    CREATE INDEX strategies_idx2
      ON strategies
      USING btree
      (id_serv, id_cata, en_service, existe);
    CREATE TABLE sauvegardes
    (
      id_strat integer,
      status smallint,
      debut timestamp without time zone,
      attente interval,
      duree interval,
      volume_mo integer,
      objets integer,
      id_cause smallint,
      affichage smallint,
      retention smallint,
      id_comment integer,
      id_svg integer,
      alarme timestamp without time zone,
      job_id bigint DEFAULT 0,
      volres_mo integer DEFAULT 0,
      CONSTRAINT ifstrat FOREIGN KEY (id_strat)
          REFERENCES strategies (id_strat) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE CASCADE,
      CONSTRAINT sauvegardes_id_strat_key UNIQUE (id_strat, debut, job_id)
    )
    WITH OIDS;
    Recherche des sauvegardes de type incrementale qui ont correctement fonctionnées en passant par une table temporaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create temporary table suivistratinc as
    select s.id_strat,s.module,s.type_strat,
    s.strategie,s.type_module,sa.debut 
    from strategies s
    join sauvegardes sa on s.id_strat=sa.id_strat
    where s.type_strat='INC'
    and sa.status in (256,257,30000,30005)
    and sa.debut = (select max(debut) from sauvegardes s2 where sa.id_strat=s2.id_strat and sa.status in (256,257,30000,30005));
    Ensuite ,je cherche ceux qui ne posséde pas une deuxieme sauvegarde qui est elle totale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select s.module,count(*) from strategies s
    join sauvegardes sa on s.id_strat=sa.id_strat
    where s.module in (select module from suivistratinc)
    and sa.debut = (select max(debut) from sauvegardes s2 where sa.id_strat=s2.id_strat and sa.status in (256,257,30000,30005))
    group by s.module
    having count(*) < 2
    order by 1;
    Est-ce plus clair?
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  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 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Utilisez une sous requête corrélée avec un NOT EXISTS.

    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 habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    bon et bien, je n'ai pas trouvé avec NOT EXISTS mais avec un NOT IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select distinct s.module 
    from strategies s
    join sauvegardes sa on s.id_strat=sa.id_strat
    where s.type_strat='INC'
    and sa.status in (256,257,30000,30005)
    and s.module not in ( 
    select s1.module from strategies s1
    join sauvegardes sa1 on s1.id_strat=sa1.id_strat
    where s1.type_strat='TOT'
    and sa1.status in (256,257,30000,30005))
    order by 3,2
    ;
    En faisant comme cela, le temps de réponse est correct.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  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
    Bonjour,

    A quoi correspond le statut ?
    A-t-il une influence sur les comparaisons de sauvegarde à faire ?

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Bonjour punkoff

    Effectivement, il est très important car je ne prends que les sauvegardes qui sont utilisables.
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

  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 760
    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 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par JUSTIN Loïc Voir le message
    bon et bien, je n'ai pas trouvé avec NOT EXISTS mais avec un NOT IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select distinct s.module 
    from strategies s
    join sauvegardes sa on s.id_strat=sa.id_strat
    where s.type_strat='INC'
    and sa.status in (256,257,30000,30005)
    and s.module not in ( 
    select s1.module from strategies s1
    join sauvegardes sa1 on s1.id_strat=sa1.id_strat
    where s1.type_strat='TOT'
    and sa1.status in (256,257,30000,30005))
    order by 3,2
    ;
    En faisant comme cela, le temps de réponse est correct.
    pas mal... Simple tranfromation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT DISTINCT s.module 
    FROM   strategies s
           INNER JOIN sauvegardes sa 
                 ON s.id_strat=sa.id_strat
    WHERE  s.type_strat='INC'
      AND  sa.STATUS IN (256,257,30000,30005)
      AND  NOT EXISTS (SELECT * 
                       FROM   strategies s1
                              INNER JOIN sauvegardes sa1 
                                    ON s1.id_strat=sa1.id_strat
                       WHERE  s.module = s1.module 
                        AND s1.type_strat='TOT'
                        AND  sa1.STATUS IN (256,257,30000,30005))
    ORDER BY 3,2
    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 habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 319
    Points : 144
    Points
    144
    Par défaut
    Merci SQLpro
    pour cette transformation

    Par contre, vous avez certainement constaté qu'il manquait deux colonnes pour que puissent fonctionner
    Si tu tapes ta tête contre une cruche et que ça sonne creux,n'en déduis pas que c'est la cruche qui est vide.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2005, 00h31
  2. J'ai besoin de votre aide pour une requête
    Par ovdz dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/05/2005, 11h42
  3. Demande d'aide pour une requête
    Par arkzor dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/12/2004, 02h40
  4. Besoin d'aide pour une Requête SQL ...
    Par Kokito dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/07/2004, 11h56
  5. besoin d'aide pour une requête
    Par Damien69 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/03/2004, 15h38

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