Vous n'êtes pas identifié(e).
Alors mersi je viens encore d'apprendre quelque chose ne pas mettre un filtre dans une vue qui sert dans une autre vue appelée à être filtrée sur le même champ.
Par contre je n'explique quand même pas pourquoi avec une valeur çà fonctionnait très bien et avec les deux autres possibles c'était catastrophique.
Si quelqu'un pourrait répondre à mon post précédent :
Desole mais j'ai un gros doute je dois bien faire un EXPLAIN SELECT * FROM v_mailing et idem pour les versions avec filtre parce que rien que le select * me donne 158 lignes ? C'est un peu abuser de la bonne voloné des gens là non ?
çà serait gentil juste pour savoir si c'était bien çà que vous attendiez de moi parce que désolé mais je met juste le résultat pour vous montrer parce que çà me paraît énorme :
EXPLAIN SELECT * FROM v_mailing WHERE st_etat_soc = 'SP'
Résultat :
"Nested Loop (cost=24923.56..30629.12 rows=1 width=656)"
" Join Filter: (soc.nm_soc_soc = public.societaire.nm_soc_soc)"
" -> Nested Loop Left Join (cost=20603.10..26087.63 rows=1 width=616)"
" Join Filter: (soc.id_soc = public.fiben.id_soc)"
" -> Nested Loop Left Join (cost=20491.10..25896.34 rows=1 width=616)"
" Join Filter: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Nested Loop (cost=19296.76..22758.56 rows=1 width=609)"
" -> Nested Loop (cost=19296.76..22758.06 rows=1 width=593)"
" -> Nested Loop (cost=19296.76..22755.47 rows=7 width=558)"
" -> Nested Loop (cost=19296.76..22745.11 rows=7 width=537)"
" -> Hash Join (cost=19296.76..22444.40 rows=43 width=294)"
" Hash Cond: (public.societaire.id_secretaire = public.utilisateur.id_usr)"
" -> Hash Join (cost=19281.70..22428.51 rows=105 width=294)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Nested Loop (cost=1415.01..4539.08 rows=4336 width=235)"
" -> Hash Join (cost=1415.01..2930.77 rows=4336 width=200)"
" Hash Cond: (tiers.id_tfs = forme_sociale.id_tfs)"
" -> Hash Join (cost=1413.51..2869.53 rows=4368 width=199)"
" Hash Cond: (tiers.id_civ = public.civilite.id_civ)"
" -> Merge Join (cost=1400.36..2791.01 rows=5786 width=125)"
" Merge Cond: (tiers.id_trs = public.societaire.id_trs)"
" -> Index Scan using tiers_pkey on tiers (cost=0.00..3916.12 rows=82650 width=117)"
" -> Sort (cost=1400.35..1414.82 rows=5786 width=16)"
" Sort Key: public.societaire.id_trs"
" -> Hash Join (cost=14.85..1038.77 rows=5786 width=16)"
" Hash Cond: (public.societaire.id_charge = public.utilisateur.id_usr)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=16)"
" -> Hash (cost=14.73..14.73 rows=10 width=8)"
" -> Hash Join (cost=13.15..14.73 rows=10 width=8)"
" Hash Cond: (public.utilisateur.id_civ = public.civilite.id_civ)"
" -> Seq Scan on utilisateur (cost=0.00..1.44 rows=10 width=12)"
" Filter: bl_ce_usr"
" -> Hash (cost=11.40..11.40 rows=140 width=4)"
" -> Seq Scan on civilite (cost=0.00..11.40 rows=140 width=4)"
" -> Hash (cost=11.40..11.40 rows=140 width=82)"
" -> Seq Scan on civilite (cost=0.00..11.40 rows=140 width=82)"
" -> Hash (cost=1.22..1.22 rows=22 width=9)"
" -> Seq Scan on forme_sociale (cost=0.00..1.22 rows=22 width=9)"
" -> Index Scan using adresse_pkey on adresse (cost=0.00..0.36 rows=1 width=43)"
" Index Cond: (adresse.id_adr = tiers.id_adrpro)"
" -> Hash (cost=17858.96..17858.96 rows=619 width=59)"
" -> Hash Left Join (cost=16798.16..17858.96 rows=619 width=59)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Hash Left Join (cost=12309.40..13360.68 rows=380 width=48)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Hash Left Join (cost=9256.95..10302.34 rows=380 width=37)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Hash Left Join (cost=6232.93..7272.98 rows=380 width=26)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Hash Left Join (cost=2981.36..4015.77 rows=380 width=15)"
" Hash Cond: (public.societaire.id_soc = public.societaire.id_soc)"
" -> Seq Scan on societaire (cost=0.00..1029.71 rows=380 width=4)"
" Filter: ((st_etat_soc)::text = ANY ('{DO,SP,EX}'::text[]))"
" -> Hash (cost=2906.14..2906.14 rows=6018 width=15)"
" -> Hash Join (cost=1194.20..2906.14 rows=6018 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=5.38..1596.95 rows=6018 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=18 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=18 width=15)"
" Filter: (id_tsa = 2)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash (cost=3096.94..3096.94 rows=12370 width=15)"
" -> Hash Join (cost=1194.44..3096.94 rows=12370 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=5.61..1660.71 rows=12370 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=37 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=37 width=15)"
" Filter: (id_tsa = 1)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash (cost=2936.27..2936.27 rows=7021 width=15)"
" -> Hash Join (cost=1194.24..2936.27 rows=7021 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=5.41..1607.02 rows=7021 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=21 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=21 width=15)"
" Filter: (id_tsa = 3)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash (cost=2956.33..2956.33 rows=7689 width=15)"
" -> Hash Join (cost=1194.27..2956.33 rows=7689 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=5.44..1613.72 rows=7689 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=23 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=23 width=15)"
" Filter: (id_tsa = 5)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash (cost=3970.57..3970.57 rows=41455 width=15)"
" -> Hash Join (cost=1195.53..3970.57 rows=41455 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=6.70..1952.65 rows=41455 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=124 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=124 width=15)"
" Filter: (id_tsa = 4)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash (cost=14.84..14.84 rows=18 width=8)"
" -> Hash Join (cost=13.15..14.84 rows=18 width=8)"
" Hash Cond: (public.utilisateur.id_civ = public.civilite.id_civ)"
" -> Seq Scan on utilisateur (cost=0.00..1.44 rows=18 width=12)"
" Filter: bl_se_usr"
" -> Hash (cost=11.40..11.40 rows=140 width=4)"
" -> Seq Scan on civilite (cost=0.00..11.40 rows=140 width=4)"
" -> Index Scan using societaire_pkey on societaire soc (cost=0.00..6.98 rows=1 width=247)"
" Index Cond: (soc.id_soc = public.societaire.id_soc)"
" Filter: (soc.st_etat_soc = 'SP'::bpchar)"
" -> Index Scan using tiers_pkey on tiers trs (cost=0.00..1.47 rows=1 width=29)"
" Index Cond: (trs.id_trs = soc.id_trs)"
" -> Index Scan using adresse_pkey on adresse adr (cost=0.00..0.36 rows=1 width=43)"
" Index Cond: (adr.id_adr = trs.id_adrcourrier)"
" -> Index Scan using societaire_info_pkey on societaire_info sif (cost=0.00..0.48 rows=1 width=24)"
" Index Cond: (sif.id_sif = soc.id_sif)"
" -> Hash Join (cost=1194.34..3016.59 rows=9695 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=5.51..1633.86 rows=9695 width=15)"
" Hash Cond: (public.societaire_societeannexe.id_soa = public.societe_annexe.id_soa)"
" -> Seq Scan on societaire_societeannexe (cost=0.00..1215.47 rows=84247 width=8)"
" -> Hash (cost=5.15..5.15 rows=29 width=15)"
" -> Seq Scan on societe_annexe (cost=0.00..5.15 rows=29 width=15)"
" Filter: (id_tsa = 6)"
" -> Hash (cost=870.59..870.59 rows=25459 width=4)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=4)"
" -> Hash Join (cost=112.00..191.24 rows=4 width=4)"
" Hash Cond: ((public.fiben.id_soc = public.fiben.id_soc) AND ((max(public.fiben.d_revu_fib)) = public.fiben.d_revu_fib))"
" -> HashAggregate (cost=45.50..65.30 rows=1584 width=8)"
" -> Seq Scan on fiben (cost=0.00..35.00 rows=2100 width=8)"
" -> Hash (cost=35.00..35.00 rows=2100 width=8)"
" -> Seq Scan on fiben (cost=0.00..35.00 rows=2100 width=8)"
" -> HashAggregate (cost=4320.45..4454.99 rows=3844 width=12)"
" -> Hash Join (cost=3297.55..4180.49 rows=9331 width=12)"
" Hash Cond: (conseil.id_soc = public.societaire.id_soc)"
" -> Hash Join (cost=2108.73..2805.04 rows=9331 width=12)"
" Hash Cond: (garantie_conseil.id_cns = conseil.id_cns)"
" -> Hash Join (cost=651.99..1161.68 rows=9331 width=12)"
" Hash Cond: (garantie_conseil.id_gar = garantie.id_gar)"
" -> Seq Scan on garantie_conseil (cost=0.00..230.06 rows=14906 width=8)"
" -> Hash (cost=448.74..448.74 rows=16260 width=12)"
" -> Seq Scan on garantie (cost=0.00..448.74 rows=16260 width=12)"
" Filter: bl_encours_gar"
" -> Hash (cost=1129.66..1129.66 rows=26166 width=8)"
" -> Seq Scan on conseil (cost=0.00..1129.66 rows=26166 width=8)"
" -> Hash (cost=870.59..870.59 rows=25459 width=8)"
" -> Seq Scan on societaire (cost=0.00..870.59 rows=25459 width=8)"
Desole mais j'ai un gros doute je dois bien faire un EXPLAIN SELECT * FROM v_mailing et idem pour les versions avec filtre parce que rien que le select * me donne 158 lignes ? C'est un peu abuser de la bonne voloné des gens là non ?
D'accord mais alors peu importe si je lance çà dans pgAdmin ou vous préferez en ligne de commande ou sans importance ?
Ce serait sans doute mieux avec la description de toutes les vues.
Mais de toute manière, en règle générale, il faut éviter de joindre des vues, car si ces vues sont elles-mêmes le résultat de jointures, on a vite fait de joindre des tables inutiles. Sans compter qu'au final on ne comprend plus ce qu'on fait.
Donc si on t'impose d'utiliser les vues, soit prudent, et si tu veux qu'on t'aide, donne toutes les infos.
Sinon il vaudrait mieux réécrire la requête en n'utilisant que des tables.Au passage, cela sert à quoi ?
LEFT JOIN ( SELECT fiben.id_soc, st_coteact_fib, st_cotecred_fib FROM fiben JOIN (SELECT MAX(d_revu_fib) AS dfiben, id_soc FROM fiben GROUP BY id_soc)maxfiben ON fiben.id_soc = maxfiben.id_soc AND fiben.d_revu_fib = maxfiben.dfiben )fib ON soc.id_soc = fib.id_soc;Sauf erreur de ma part, tu ne t'en sert pas...
Enfin, quel est ton souci avec explain et explain analyze? tu l'as fait ou pas?
Merci. Je vais en premier lieu regarder dans ce sens et essayer de n'utiliser que les tables.
Le bloc sur le fiben sert bien mais effectivement j'avais enlever le champ.
Pour ce qui est de l'analyse et du explain non je n'ai pas encore fait l'execution car je ne sais pas du tout comment exploiter la sortie.
Voilà je reviens vers vous plus tard et encore merci à tous.
Merci de votre réponse et désolé mais j'ai du aller en réunion voilà pourquoi je ne vous ai pas répondu tout de suite.
Je dois aller en déjeuner avec une responsable alors je vous fournit les éléments en début d'après midi .
Merci en tous les cas et Bon ap à tous en attendant.
PS la vue elle est la suivante :
CREATE OR REPLACE VIEW v_mailing AS
SELECT
soc.id_soc,
soc.nm_soc_soc,
soc.st_etat_soc,
soc.st_url_soc,
siege.fsc,
siege.raisonsociale,
siege."initialeCE",
siege."initialeSE",
sif.d_passsp_sif,
sif.d_passpo_sif,
sif.d_fingar_sif,
sif.d_arch_sif,
siege.st_enseigne_trs,
siege.st_adr_adr,
siege.st_cp_adr,
siege.st_ville_adr,
siege.st_tel1_trs,
siege.portable,
siege.st_tel2_trs,
siege.st_fax_trs,
siege.st_email_trs,
soa.franchiseur,
soa.syndicat,
soa.groupement,
soa.exgarant,
soa.assureur_rcp,
soa.presta_info,
soc.st_formesocialec_soc AS fscour,
soc.st_enseignec_soc AS enscour,
soc.st_raisonc_soc AS rscour,
adr.st_adr_adr AS adrcour,
adr.st_cp_adr AS cpcour,
adr.st_ville_adr AS vilcour,
trs.st_ape_trs,
trs.st_sirene_trs,
trs.st_clesir_trs,
trs.fg_persmor_trs,
soc.bl_transcla_soc,
soc.bl_fdcom_soc,
soc.bl_gerance_soc,
soc.bl_syndic_soc,
soc.bl_locsais_soc,
sif.d_renouv_sif,
soc.st_obs_soc AS obs_etac,
soc.st_obsref_soc AS obs_ref,
soc.d_moisclot_soc,
soc.st_cdr_soc,
gar.s,
gar.t,
gar.g,
gar.m,
gar.p
FROM
societaire soc
JOIN
v_soc_siege siege ON siege.id_soc = soc.id_soc
JOIN
tiers trs ON soc.id_trs = trs.id_trs
JOIN
adresse adr ON trs.id_adrcourrier = adr.id_adr
JOIN
v_soc_societe_annexe soa ON soc.id_soc = soa.id_soc
JOIN
societaire_info sif ON soc.id_sif = sif.id_sif
JOIN
v_garantie_colone gar ON soc.nm_soc_soc = gar.nm_soc_soc
LEFT JOIN
( SELECT fiben.id_soc, st_coteact_fib, st_cotecred_fib
FROM fiben JOIN
(SELECT MAX(d_revu_fib) AS dfiben, id_soc
FROM fiben GROUP BY id_soc)maxfiben
ON fiben.id_soc = maxfiben.id_soc AND fiben.d_revu_fib = maxfiben.dfiben )fib
ON soc.id_soc = fib.id_soc;
Vous me direz s'il faut le détail des intermédiaires mais je ne voudrez pas trop abuser de vtre tps c pkoi je demandais juste des pistes au départ.
Merci encore
Bonjour à tous.
Voilà j'ai un problème sur les bras mais je suis trop 'léger' comme éléphant et je ne sais pas vraiment ou chercher.
J'exécute une vue en faisant un SELECT * FROM v_mailing et ma réponse arrive en 1s.
Maintenant si je fais Un :
SELECT * FROM v_mailing WHERE st_etat_soc = 'SP' elle se termine en 149s pour 3861 lignes et si je fais la même chose mais avec :
SELECT * FROM v_mailing WHERE st_etat_soc = 'EX' elle se termine en 1s pour 2184 lignes.
J'ai un index sur le champ du filtre et j'ai effectué un VACUUM.
Pourriez-vous me donner des pistes s'il vous plaît en sachant que j'ai regardé la doc officielle pour les explain et analyse mais que j'avoue je n'ai pas vraiment compris.
Alors c bon
Merci beaucoup à tous les deux alors je crois que je vais être obligé de créer pas mal d'index.
Après je me mettrais à la configuration de mon serveur .....
Question : que doit on faire pour cloturer un post??
Merci pour la réponse donc pour moi vu que j'ai environ 20000 lignes dans la t1 il peut être bon de mettre un index si j'ai bien compris.?
Une autre précision (ne rigolez pas s'il vous plait) :
Si dans une table j'ai une clé étrangère id_trs qui lie ma table t1 à la table tiers qui a pour clé primaire id_trs me faut-il mettre un index sur la colone id_trs de t1 ou pas alors ????
Merci d'avance
Alors ça va dans le sens de ce que j'avais compris . Merci beaucoup pour la confirmation.
Bonjour à tous,
je ne connaît vraiment pas grand chose en BDD aussi à force de lire je glane mes infos au fil des pages. Ainsi je pensais que automatiquement sur une clé étrangère il y avait un index de crée mais il semble que non.
Quelqu'un pourrait-il me confirmer ainsi que le bien fondé de créer dans ce cas un index systématiquement sur les clé qui servent par la suite dans les jointures.
Merci par avance.
Gilles.
Autres solution : pour les sequences on a : SELECT * FROM information_schema.sequences
Desole si j'ai fait perdre du temps à quelqu'un en cherchant plus j'ai eu ma réponse merci à Guillaume (Gleu) qui avait déjà donné la solution en répondant à une autre question...
Solution donc :
Le catalogue système pg_class contient toutes les informations nécessaires pour faire cette opération. Il vous suffit d'exécuter une requête sur cette table en récupérant le nom de l'objet (colonne relname) après avoir fait un filtre sur le type (relkind, r pour table, i pour index, s pour séquence). N'oubliez pas de filtrer les objets systèmes (ie tous ceux dont le nom commence par pg_).
Donc, exécutez cette requête dans la fonction PL/pgsql, utilisez une boucle FOR pour récupérer ligne par ligne (donc table par table, index par index, séquence par séquence), et construisez une chaîne de requête pour exécuter le ALTER objet nom OWNER TO utilisateur.
Merci encore
Bonjour à tous.
Après recherche je ne trouve pas s'il existe un moyen de récupérer via une fonction tous les noms des séquences de ma base de manière à pourvoir effectuer un reset des valeurs.
Quelqu'un aurait-il une méthode ?
Merci par avance
Merci de ta réponse je vais regarder du côté des types composites.
A nouveau j'ai besoin de votre aide:
j'ai donc maintenant mes trois fonctions mais je voudrais en creer une autre qui me permettre de passer en parametre le nom d'une table, la clé primaire de la table et le nom du champ adresse de maniere a avoir tous les resultats pour :
select table.id, table.champAdresse, coupeAdresseNum(champAdresse), coupeAdresseVoie( champAdresse ), coupeAdresseNom( champAdresse )
est-ce possible ??
J'ai regardé un peu du côté de RETURN NEXT AVEC SETOF mais je vois pas vraiment quel type je dois mettre en retour
Merci si vous pouvez m'aider.
Merci beaucoup,
je vais essayer comme çà.
Bonjour à tous,
voilà j'ai une fonction qui découpe une adresse en num, voi et nom à partir d'un texte.
Ce que je voudrais en fait c pouvoir parcourir une table et appliquer cette fonction sur le champ adresse de la table et avoir en sortie le tout.
TABLE PERSONNE (
id int,
nom varchar(30)
adresse varchar(60)
cp varchar(5)
....
.
.
.
.....
)
CREATE OR REPLACE FUNCTION coupeAdresse( TEXT, OUT rue varchar(5), OUT voie varchar(50), OUT nom varchar(34) )
AS $$
SELECT substring ( ltrim( $1,' ') from '[0-9]*') ,
upper (substring ( upper($1) from 'RUE|ALLEE|AVENUE|BOULEVARD') ) ,
upper (ltrim( regexp_replace( ltrim( regexp_replace ( upper ( ltrim ( $1,' ' ) ) ,'[0-9]*','' ),','), 'RUE|ALLEE|AVENUE|BOULEVARD',''),' ')) ;
$$LANGUAGE SQL;
et donc pouvoir
boucler sur la table en applicant coupeAdresse ( PERSONNE.adresse )
quelqu'un aurait-il une idée .??
Merci d'avance