Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 11/07/2012, 14h01   #1
JUSTIN Loïc
Membre régulier
 
Homme Loïc JUSTIN
Administrateur de base de données
Inscription : novembre 2004
Messages : 244
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 : 244
Points : 99
Points : 99
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éduits pas que c'est la cruche qui est vide.
JUSTIN Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 11h24   #2
JUSTIN Loïc
Membre régulier
 
Homme Loïc JUSTIN
Administrateur de base de données
Inscription : novembre 2004
Messages : 244
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 : 244
Points : 99
Points : 99
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éduits pas que c'est la cruche qui est vide.
JUSTIN Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 11h46   #3
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 080
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 : 12 080
Points : 21 678
Points : 21 678
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 14h47   #4
JUSTIN Loïc
Membre régulier
 
Homme Loïc JUSTIN
Administrateur de base de données
Inscription : novembre 2004
Messages : 244
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 : 244
Points : 99
Points : 99
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éduits pas que c'est la cruche qui est vide.
JUSTIN Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 14h57   #5
punkoff
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 2 154
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 2 154
Points : 3 486
Points : 3 486
Bonjour,

A quoi correspond le statut ?
A-t-il une influence sur les comparaisons de sauvegarde à faire ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2012, 15h20   #6
JUSTIN Loïc
Membre régulier
 
Homme Loïc JUSTIN
Administrateur de base de données
Inscription : novembre 2004
Messages : 244
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 : 244
Points : 99
Points : 99
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éduits pas que c'est la cruche qui est vide.
JUSTIN Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/07/2012, 09h21   #7
SQLpro
Rédacteur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 12 080
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 : 12 080
Points : 21 678
Points : 21 678
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 * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/07/2012, 14h06   #8
JUSTIN Loïc
Membre régulier
 
Homme Loïc JUSTIN
Administrateur de base de données
Inscription : novembre 2004
Messages : 244
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 : 244
Points : 99
Points : 99
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éduits pas que c'est la cruche qui est vide.
JUSTIN Loïc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h42.


 
 
 
 
Partenaires

Hébergement Web