|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Bonjour,
pour mon projet de fin d'étude de Master Informatique, je dois réaliser une application qui permet de charger des fichiers historiques concernant l'année 2007, sur trois départements. Il faut compter 20 000 lignes par fichier, pour 12 mois. 12 x 3 x 20 000 je vous laisse imaginer la quantité de données à charger. La création de clé primaire en amont étant anarchique (et buggée ? Je précise que je ne peut rien faire à ce niveau), il arrive de retrouver plusieurs fois la meme clé sur le meme département ou d'un département à l'autre, ma clé primaire est donc composée du numéro d intervention (entier), de l'id du departement(varchar 2 caractères mais je n'ai pas défini cette limite) ainsi que d'un autre champ unique trouvé (varchar non limité). Au début de l'importation je ma clé primaire n'était composée que de deux champs, et je trouvai que l'importation par COPY FROM etait assez rapide malgré la quantité de données. J'ai du ajouter un troisième champ, et depuis c'est de plus en plus lent et je me trouve confronté a des timeout (max 30 sec of execution sur php). J'aimerai votre avis, puis-je supprimer la clé primaire ? Cela va il impacter la rapidité de mon script (en bien)? Ou dois-je créer une nouvelle clé primaire pour remplacer cette clé composite ? De manière plus générale, j'aimerais que vous me conseillez sur les bonne pratiques à suivre pour la mise en place et la bonne utilisation d'une telle base. Merci à ceux qui seront arrivés jusqu'au bout de ce message, ce fut long mais j'ai tenté de décrire au mieux le contexte de la mise en place. |
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Pour des perfs optimales, c'est mieux de ne pas avoir de clé primaire sur la table, mais attention à ne pas insérer de doublons ;-)
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Ah, oui je n'y avai pas pensé, il y a le risque d'insérer des doublons.
Donc que me conseilles tu ? L'absence de clé primaire permet elle aussi d'améliorer les performances au niveau des COUNT ? |
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Non l'absence de clé primaire améliore les perfs juste pour les insert et update, car à chaque fois il contrôle justement avant de modifier s'il n'y a pas de doublons, ce qui peut être coûteux pour de gros volumes
Une clé primaire crée aussi implicitement un index qui est mis à jour à chaque modif (insert/update/delete) qui peut être coûteux aussi Sur les select, les PK peuvent même améliorer les perfs car postgresql utilisera peut être l'index si le select ne ramène pas trop de lignes Regarde la doc sur l'optimiseur Postgresql avec notamment le calcul des stats et les plans d'exécution
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#5 | ||
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Après avoir fait quelques tests, je peux parler plus en détail des performances au niveau des requêtes.
Code :
Pour scheu, j'ai lu le document et d'apres le explain la première opération qu'il fait est un 'group agrégate', et il fait les filter (clause where) lors des dernière opérations. J'ai vaguement souvenir d'un cours de licence ou l'on parlait d'optimisation des requêtes en commencant par faire les clauses where mais dans ce cas précis j'aurai besoin d'un coup de pouce. |
||
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Quelles sont les volumétries (nb de lignes) de tes tables, et le nb de lignes retournées par ta requête ?
Les stats sur ces 2 tables sont-elles à jour ? As-tu des indexes sur ces 2 tables ? Sur quelles colonnes ? Mets-nous le résultat de "explain ta_requete;"
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#7 | ||
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Code :
|
||
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Combien de lignes de la table histo vérifient la condition "DATE IT" BETWEEN '01/05/2007' AND '31/05/2007' AND "BASE_GPC"='1G' ?
Combien de lignes de la table etl vérifient la condition "BASE_GPC"='1G' ? Combien de temps prend juste la requête suivante : Code :
SELECT * FROM histo WHERE "DATE IT" BETWEEN '01/05/2007' AND '31/05/2007' AND "BASE_GPC"='1G'
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#9 | |||
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Je réponds rapidement en citant :
Citation:
Citation:
Citation:
|
|||
|
00
|
|
|
#10 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
Le problème vient donc juste du filtre WHERE "DATE IT" BETWEEN '01/05/2007' AND '31/05/2007' AND "BASE_GPC"='1G' sur la table histo, vu que ça prend la totalité du temps de la requête
Quels sont les types de données des colonnes date_it et base_gpc ? Combien de temps met la requête SELECT * from histo ? Indique le résultat de "explain SELECT * from histo" As-tu configuré le fichier postgresql.conf ou bien as-tu tout laissé par défaut à l'installation ? Dans le fichier postgresql.conf, quelles sont les valeurs des paramètres shared_buffers, work_mem, temp_buffers, maintenance_work_mem ? Combien de RAM as-tu sur ton serveur ?
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#11 | ||||||
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Citation:
base gpc :character varying Citation:
Citation:
Citation:
Citation:
#work_mem = 1MB (J'ai laissé le # car c'est commenté je suppose) #temp_buffers = 8MB #maintenance_work_mem = 16MB Citation:
(Désolé j'ai pas répondu hier). |
||||||
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 1 497 ![]() |
4 minutes pour parcourir une table de 300 000 lignes ça paraît beaucoup quand-même.
Le problème doit venir soit de ton paramétrage postgresql, soit du hardware Si y a pas grand chose d'autre qui tourne sur ton pc, essaie d'augmenter le shared_buffers à 256MB, et le work_mem à 32MB, de reloader la conf (pg_ctl reload -D <rep>), et de retester Sinon c'est sans doute ton disque qui est lent, en tous les cas ce n'est pas un problème lié à ta requête
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne. La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi ! Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/ |
|
|
00
|
|
|
#13 |
|
Membre du Club
![]() Inscription : mai 2007 Messages : 149 ![]() |
Ok merci.
Je ferai la configuration postgres sur le serveur quand je déploierai. |
|
00
|
Copyright © 2000-2012 - www.developpez.com