Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Membre habitué
    Homme Profil pro Loïc JUSTIN
    Administrateur de base de données
    Inscrit en
    novembre 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc JUSTIN
    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 : 318
    Points : 111
    Points
    111

    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 Loïc JUSTIN
    Administrateur de base de données
    Inscrit en
    novembre 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc JUSTIN
    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 : 318
    Points : 111
    Points
    111

    Par défaut

    Complément d'information
    Structure de mes deux tables utilisées dans ma requetes
    Code :
    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 :
    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 :
    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 Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 13 581
    Points : 30 109
    Points
    30 109

    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
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  4. #4
    Membre habitué
    Homme Profil pro Loïc JUSTIN
    Administrateur de base de données
    Inscrit en
    novembre 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc JUSTIN
    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 : 318
    Points : 111
    Points
    111

    Par défaut

    bon et bien, je n'ai pas trouvé avec NOT EXISTS mais avec un NOT IN
    Code :
    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é Sénior
    Homme Profil pro
    Inscrit en
    mai 2002
    Messages
    3 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : mai 2002
    Messages : 3 084
    Points : 5 098
    Points
    5 098

    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 Loïc JUSTIN
    Administrateur de base de données
    Inscrit en
    novembre 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc JUSTIN
    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 : 318
    Points : 111
    Points
    111

    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 Frédéric BROUARD
    Expert SGBDR & SQL
    Inscrit en
    mai 2002
    Messages
    13 581
    Détails du profil
    Informations personnelles :
    Nom : Homme Frédéric BROUARD
    Localisation : France

    Informations professionnelles :
    Activité : Expert SGBDR & SQL
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 13 581
    Points : 30 109
    Points
    30 109

    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 :
    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 :
    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
    Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
    http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  8. #8
    Membre habitué
    Homme Profil pro Loïc JUSTIN
    Administrateur de base de données
    Inscrit en
    novembre 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc JUSTIN
    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 : 318
    Points : 111
    Points
    111

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •