Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#151 Re : PL/pgSQL » [RESOLU] Utilisation des fonctions fenêtrées » 21/04/2010 15:33:37
Ah, désolée j'avais pas lu le détail de la clause Where... Je n'avais pas compris ce qu'elle faisait vraiment.
Il faut bien que vous gardiez intervention dans ce cas. Je ne vois pas comment réécrire cette requête comme ça.
#152 Re : PL/pgSQL » [RESOLU] Utilisation des fonctions fenêtrées » 21/04/2010 13:01:02
Ah oui maintenant je comprends mieux pourquoi vous devez faire la jointure avec intervention à chaque fois.
Avez-vous ajouté l'index sur int_refinst comme conseillé par gleu?
#153 Re : PL/pgSQL » [RESOLU] Utilisation des fonctions fenêtrées » 21/04/2010 11:16:43
La question principale est : qu'est-ce que int_refinst? Dans intervention, y a-t-il plusieurs id_ca pour le même int_refinst ?
Et pourquoi conclusion_ig et intervention ont la même clé?
#154 Re : PL/pgSQL » [RESOLU] Utilisation des fonctions fenêtrées » 20/04/2010 21:26:00
A la lecture de la requête, je trouve cela très curieux, la jointure avec intervention dans chaque sous-requête. J' ai l'impression que les sous-requêtes pourraient toutes fort bien se passer de la jointure avec intervention. Ou alors qu'il y a un truc bizarre dans le schéma.
Est-ce que id_ca identifie la même chose que int_refinst?
Sinon, dites-en un peu plus sur les tables, leur identifiant, les critères de jointure ...
#155 Re : Général » Dblink entre Oracle et Postgresql » 15/04/2010 19:02:48
Quand je disais export, c'est pas par l'outil du même nom, mais par une procédure stockée qui exporte les données en csv...
#156 Général » Dblink entre Oracle et Postgresql » 15/04/2010 17:43:27
- flo
- Réponses : 7
Bonjour,
J'ai des données à transférer d'une base Oracle 10g vers une base Postgresql 8.1.
Si j'ai bien compris, on peut utiliser le module dbi-link pour accéder de la base Oracle à la base Postgresql.
Ou bien on peut se connecter à partir d'Oracle via le driver ODBC.
C'est bien cela?
Sachant que je n'ai pas les droits d'administration sur les machines où sont installées les moteurs (AIX pour Oracle, RHEL 5 pour Postgresql), qu'est-ce qui vous semble le moins compliqué à faire? Ou bien est-ce que j'ai intérêt à faire autrement (export des données + réimport)?
Je dois avoir fini demain soir...
#157 Re : Optimisation » Optimisation de l'activitée » 10/04/2010 21:36:51
Merci mais le but serait de pouvoir avoir une trace des requetes longues, courtes mais utilisées un grand nombre de fois, et surtout les requetes qui font des deadlocks ou qui sont en attente d'une table verrouillée.
Bonjour,
J'ai l'impression que nous partons sur de faux problèmes. Je m'explique : votre problème est de repérer les requêtes dont les performances ont un impact sur les utilisateurs, non? (requêtes longues, requêtes courtes mais surchargeant les bases, les requêtes en attente). Je suppose que ces requêtes sont les requêtes d'une ou plusieurs applications dont vous cherchez à contrôler et/ou améliorer les performances? Dans ce cas, je ne pense pas que la présence de quelques requêtes effectuées via pgAdmin vous gêne beaucoup.
Les outils que vous pouvez utiliser pour répondre à vos besoins sont :
pg_stat_statements pour les requêtes longues, et pour les courtes exécutées fréquemment,
log_min_duration pour avoir la trace des requêtes les plus longues dans la log,
Les deadlocks sont tracés dans la log.
Il y a également quelque chose qui me gêne dans votre formulation : "en attente d'une table verrouillée". Hors une table ne peut être verrouillée que par une modification de structure de la table (ALTER TABLE ...). Sinon, seules les lignes peuvent être verrouillées (et en mode READ COMMITTED, seuls les écritures verrouillent, et elles verrouillent seulement les autres écritures sur la même ligne). Êtiez-vous au courant de ce fait?
#158 Re : Optimisation » Optimisation de l'activitée » 07/04/2010 21:42:36
Si le but est de tracer les requêtes longues, est-ce que les tracer dans les logs pourrait convenir?
En réglant le paramètre log_min_duration_statement (integer)
http://docs.postgresql.fr/8.4/runtime-c … gging.html
Désolée si je suis un peu hors-sujet, mais le but de tracer les requêtes longues m'y a fait penser.
#159 Re : Site PostgreSQL.fr » Les présentations du pgday 2008 » 27/03/2010 08:53:24
De rien, c'était purement intéressé. ![]()
Merci à toi plutôt, pour avoir réparé.
#160 Site PostgreSQL.fr » Les présentations du pgday 2008 » 26/03/2010 15:52:25
- flo
- Réponses : 3
Je cherche les pdf des présentations du pgday 2008. J'ai fini par retrouver cette page : http://2008.pgday.fr/doku.php/programme
Les liens vers les pdf sont morts. Quelqu'un saurait comment les retrouver?
Merci.
#161 Re : Optimisation » Question sur les index multi-colonnes » 11/03/2010 11:10:11
Pour finir, merci gleu et Marc. J'ai gardé la clé primaire pour le moment telle qu'elle est, plus un index sur l'id. Pour le moment, pas de problème détecté.
#162 Re : Optimisation » Question sur les index multi-colonnes » 10/03/2010 19:29:18
oui, 11 ms (il n'utilise pas le même index) :
explain analyze select id from service_rendu where id = '1000001'
"Index Scan using index_sre_bef on service_rendu (cost=0.00..64.87 rows=16 width=12) (actual time=11.642..11.642 rows=0 loops=1)"
" Index Cond: (id = '1000001'::bpchar)"
"Total runtime: 11.685 ms"
(je n'ai pas mis la même valeur, mais c'est comme tout à l'heure une valeur qui n'est pas présente dans la table)
#163 Re : Optimisation » Question sur les index multi-colonnes » 10/03/2010 17:52:12
J'ai fait un reindex et un analyze, c'est un peu mieux (30 ms pour la même requête).
#164 Re : Optimisation » Question sur les index multi-colonnes » 09/03/2010 16:20:27
Marc : après le vacuum, cela va un peu plus vite, mais il utilise toujours le même index.
Et pour les estimations, merci pour l'explication, je vais essayer de convaincre le chef pour la réécriture des requêtes, mais ce ne sera pas pour tout de suite.
#165 Re : Optimisation » Question sur les index multi-colonnes » 09/03/2010 15:16:57
l'explain analyze donne cela :
Index Scan using index_n_sre on latable (cost=0.00..13.42 rows=3 width=12) (actual time=85.637..85.637 rows=0 loops=1)
Index Cond: ((modulo = 4::numeric) AND (id = '111111'::bpchar))
Total runtime: 85.725 ms
#166 Optimisation » Question sur les index multi-colonnes » 09/03/2010 12:52:00
- flo
- Réponses : 10
Bonjour,
J'ai une table, qui ressemble à ceci :
id character(8) not null,
modulo numeric(2) not null,
numero numeric(2) not null,
service numerec(3) not null,
[...] autres colonnes.
clé primaire sur :
(modulo, id, numero, service)
c'est une base 8.1, et elle est actuellement en production.
Le souci, c'est que j'ai des tas d'index définis dans tous les sens sur cette table, notamment des index sur :
(id, modulo)
(id, modulo, numero),
(modulo, id, service),
(id, numero, service). Je dois faire un peu de "ménage".
Le modulo est en fait calculé à partir de l'id (il ne dépend que de l'id)
La plupart des requêtes ont comme critère de sélection ou de jointure, soit id seul, soit id et modulo. Aucune n'utilise le modulo seul.
Mon idée de départ était de remettre dans l'ordre la clé primaire, pour avoir l'index sur id, puis modulo. Seulement vu que c'est en production, c'est un peu compliqué (il y a beaucoup de clés étrangères qui en dépendent, et la table fait 7 millions de ligne). Pensez-vous que cela pose problème, dans ce cas de figure, d'avoir la clé primaire d'abord sur le modulo? C'est une base dont les temps de réponse en lecture sont plus importants pour le client que les écritures, et il y a bien plus de lectures que de mises à jour.
Et une autre question : j'ai fait un test :
explain analyze
select id from latable where id='111111' and modulo = '4';et contrairement à ce que je pensais, c'est un index sur (modulo, id, service) qui est utilisé, alors que je pensais que ce serait un index dont les premiers champs étaient (id, modulo) qui serait utilisé (id est plus discriminant que modulo). Avez-vous une idée de la raison de cela?
Merci d'avoir lu jusqu'au bout!
Flo
#167 Re : Général » Réinstallation de PostgreSql 8.4 » 06/03/2010 16:47:20
Que veux-tu dire par "persiste toujours"? Depuis quand as-tu ce problème? Qu'as-tu fais avant d'avoir ce problème? (apparemment ce n'était pas une nouvelle installation puisque tu dis que la base contenait ton site web...)
Et après la réinstallation, de quel dossier parles-tu (celui que tu as mis dans data/base)???
#168 Re : Optimisation » Question sur une requête » 03/03/2010 16:18:12
Normalement, peu d'enregistrements vont répondre au critère bef_a_id dans sr (de l'ordre de quelques dizaines maximum). Sur cette table (service_rendu alias sr), il y a des index (13 index !!!), dont 3 ont bef_a_id comme première colonne.
Sur parcours_extranet, la clé primaire a comme première colonne bef_a_id, mais il n'y a pas d'index sur bef_a_id et prs_d_debut...
Sinon, tu voulais écrire :
order by prs_d_debut
LIMIT 1
je suppose?
#169 Optimisation » Question sur une requête » 03/03/2010 14:32:22
- flo
- Réponses : 3
Bonjour,
j'ai besoin d'un avis extérieur. J'ai une requête qui doit s'exécuter en un temps raisonnable, c'est à dire quelques secondes maximum (pour de l'affichage sur une application web)
Mon problème, c'est que les tables actuellement en production ou en test sont peu remplies, la requête est rapide.
Mais je pense que ce ne sera plus le cas lorsque les tables seront remplies, en particulier parcours_extranet.
Voilà la bête :
SELECT 'A' AS TYPE, s.ser_a_libelle AS libelle, NULL AS noffre,
sr.cre_a_code AS cr, sr.sre_d_debut AS datedebut,
NULL AS daterealisation, sr.sre_d_fin AS datefin,
sr.sre_n_duree_h_prest AS duree, r.res_a_libelle AS resultat,
NULL AS motifdepart, sr.sre_n_nordre_service AS nordre,
min_pe.min_date,
min_pe.bef_a_id
FROM
service_rendu sr
LEFT OUTER JOIN resultat r
ON (sr.rpo_a_codet = r.res_a_id)
LEFT OUTER JOIN service s ON (s.ser_a_id = sr.ser_a_id)
LEFT OUTER JOIN
(
-- jointure avec le premier parcours_extranet pour éliminer les éléments de service dont la date correspond à une date dans parcours_extranet
SELECT MIN (prs_d_debut) as min_date, bef_a_id
FROM parcours_extranet
WHERE bef_a_id = '00000012'
group by bef_a_id
) as min_pe
ON (min_pe.bef_a_id = sr.bef_a_id)
WHERE sr.bef_a_id = '00000012'
AND s.cas_a_id IN ('S3', 'S4', 'S5', 'S6', 'S7')
AND (min_pe.min_date is null or sr.sre_d_debut < min_pe.min_date ) --supprimer les services suivant la date
ORDER BY datedebut DESC
et le plan d'exécution :
Sort (cost=101.92..101.97 rows=21 width=119) (actual time=0.427..0.428 rows=1 loops=1)
Sort Key: sr.sre_d_debut
-> Hash Left Join (cost=100.54..101.46 rows=21 width=119) (actual time=0.402..0.418 rows=1 loops=1)
Hash Cond: ("outer".bef_a_id = "inner".bef_a_id)
Filter: (("inner".min_date IS NULL) OR ("outer".sre_d_debut < "inner".min_date))
-> Merge Left Join (cost=99.28..100.08 rows=21 width=115) (actual time=0.354..0.368 rows=2 loops=1)
Merge Cond: ("outer".ser_a_id = "inner".ser_a_id)
Filter: (("inner".cas_a_id = 'S3'::bpchar) OR ("inner".cas_a_id = 'S4'::bpchar) OR ("inner".cas_a_id = 'S5'::bpchar) OR ("inner".cas_a_id = 'S6'::bpchar) OR ("inner".cas_a_id = 'S7'::bpchar))
-> Sort (cost=95.55..95.60 rows=21 width=83) (actual time=0.144..0.148 rows=4 loops=1)
Sort Key: sr.ser_a_id
-> Merge Right Join (cost=84.67..95.09 rows=21 width=83) (actual time=0.114..0.131 rows=4 loops=1)
Merge Cond: ("outer".res_a_id = "inner".rpo_a_codet)
-> Index Scan using pk_resultat on resultat r (cost=0.00..9.79 rows=162 width=35) (actual time=0.012..0.032 rows=21 loops=1)
-> Sort (cost=84.67..84.73 rows=21 width=60) (actual time=0.057..0.066 rows=4 loops=1)
Sort Key: sr.rpo_a_codet
-> Index Scan using index_sre_benef_parc on service_rendu sr (cost=0.00..84.21 rows=21 width=60) (actual time=0.030..0.042 rows=4 loops=1)
Index Cond: (bef_a_id = '00000012'::bpchar)
-> Sort (cost=3.73..3.85 rows=46 width=53) (actual time=0.155..0.176 rows=32 loops=1)
Sort Key: s.ser_a_id
-> Seq Scan on service s (cost=0.00..2.46 rows=46 width=53) (actual time=0.004..0.051 rows=46 loops=1)
-> Hash (cost=1.25..1.25 rows=1 width=16) (actual time=0.027..0.027 rows=1 loops=1)
-> HashAggregate (cost=1.23..1.24 rows=1 width=16) (actual time=0.022..0.022 rows=1 loops=1)
-> Seq Scan on parcours_extranet (cost=0.00..1.23 rows=1 width=16) (actual time=0.006..0.012 rows=1 loops=1)
Filter: ((bef_a_id = '00000012'::bpchar) AND (bef_a_id = '00000012'::bpchar))
Total runtime: 0.688 ms
Volumes actuels :
resultat 162 table paramètre, ça ne va pas beaucoup bouger
service_rendu 6 000 000
service 46 (table parametre)
parcours_extranet 17 (celle-là va se remplir)
Il n'y a pas de clé étrangère entre service_rendu et parcours_extranet.
Je pense que pour avoir une idée de ce que cela va donner en production, il faut en test charger la table parcours_extranet avec un bon volume (de l'ordre de 500 000 lignes ), mais mon chef n'est pas chaud (trop long à faire car on n'a aucun outil pour le moment...).
Puis-je déduire quelque chose du plan, sachant que je n'ai pas les bons volumes?
Si je fais ce qu'il faut pour remplir les tables, y a-t-il un point sur lequel je doive faire attention afin que cela soit significatif (répartition des données...). Y a-t-il des spécificités de Postgres que je doive prendre en compte (on est en 8.1)?
Avez-vous un conseil à me donner?
#170 Re : Général » Conception » 05/02/2010 18:23:14
Si j'ai bien compris, il y a toujours des propriétés différentes entre les tables alerte : les clés étrangères vers maison ou propriétaire ou voiture. Donc héritage (conceptuel) sur les alertes. Après il y différentes solutions pour représenter l'héritage, dont l'héritage de tables. Le choix doit se faire en fonction de ce que fait l'application.
Sinon attention avec les exemples bidon à ne pas confondre le cas de l'association (comme ici, une voiture peut changer de propriétaire) et celui de la composition (comme avec les lignes de facture par exemple, dans ce cas la première colonne de la clé primaire de la table ligne doit contenir la clé de la table facture...)
un lien fort intéressant là-dessus (merci Marc...)
http://it.toolbox.com/blogs/database-so … ases-32525
#171 Re : Général » Conception » 05/02/2010 12:06:47
- j'ai pense au debut travailler avec des tables heritees (sur maison/voiture/propritaire)
Que voulez-vous dire ? quelle table hérite de quoi?
#172 Re : Général » alter table » 15/01/2010 14:40:31
Normal, le "AFTER" est probablement une spécificité MySql.
Remplacez par :
ALTER TABLE etudiant ADD COLUMN adresse varchar(30)
Sinon, la discussion n'est pas au bon endroit (la catégorie "Général" est plus appropriée).
#173 Re : Java » Version du driver JDBC pour postgresql v8.3.X » 05/01/2010 17:51:28
Cela dépend de ta version de la JVM aussi. C'est bien expliqué sur la page de download : si tu utilises le jdk 1.6, il te faut la version JDBC4. Sinon, la version JDBC3.
#174 Re : Général » Probleme sur execution d'une requête » 22/12/2009 14:15:07
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?
#175 Re : Général » Trier et injecter dans une base. » 25/11/2009 11:52:58
Oui, cela me conforte dans l'idée que la meilleure chose que supai aurait à faire pour commencer, c'est apprendre un minimum de choses sur la théorie relationnelle (non cela ne mord pas), et de SQL. Juste pour comprendre comment on travaille avec une base relationnelle.
Quelqu'un a une idée de ce qu'on peut conseiller pour cela? (livre, formation en ligne…) Désolée j'en ai pas (les supports de formation de ma boîte sont propriétaires, et je ne connais pas de bouquin pour débutant).