Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#26 Optimisation » UPDATE massif » 12/02/2013 19:31:21
- gom
- Réponses : 17
Bonjour,
J'ai fait une reprise de données sur un Datawarehouse et la volumétrie a explosé ! Je suis passé de 670 Go à 1,4 To ! ![]()
Non je n'ai pas fait d'INSERT !
J'ai bien fait uniquement des UPDATE.
Cette explosion de la volumétrie apparaît principalement sur 3 tables :
-- Table 1
-- Prod : 54 GB + 36 GB
-- Recette : 104 GB + 92 GB-- Table 2
-- Prod : 111 GB + 54 GB
-- Recette : 248 GB + 108 GB-- Table 3
-- Prod : 126 GB + 72 GB
-- Recette : 349 GB + 253 GB
Je pensais faire comme ça pour résoudre ce problème, mais rien que sur la plus petite table au bout de 3 heures le VACUUM FULL n'est toujours pas fini !!
DROP INDEX ...;
vacuum full ...;
CREATE INDEX ...;
vacuum analyze ...;Une autre idée ? Est-ce qu'un paramétrage particulier de PostgreSQL.conf aiderait ?
Gôm
#27 Re : Optimisation » Quelle quantité de RAM allouer ? » 12/02/2013 19:12:28
Ai-je quelque chose à modifier au final ?
Oui, baisser work_mem.
Merci.
A combien ?
#28 Re : Optimisation » Quelle quantité de RAM allouer ? » 30/01/2013 15:12:37
Bonjour rjuju !
tout simplement parce que 25% de la RAM pour le shared_buffers est un réglage qui convient bien en général.
OK donc je laisse le shared_buffers à 2GB. Merci. ![]()
Postgres utilise des accès disques standard, et le cache système est donc à prendre en compte.
Cela signifie que plutôt d'augmenter le shared_buffers, il vaudrait mieux que je vérifie le paramétrage du cache système ?
De plus, la valeur de work_mem est très haute (300 Mo), et une grande quantité de RAM peut être utilisée pour les tris.
Je n'ai pas compris. Ai-je quelque chose à modifier au final ?
Le paramètre wal_buffers pourrait par contre être montée à 16Mo.
OK je change ça tout de suite. Encore merci ! ![]()
Précision : ma base de Prod est un Datawarehouse et mon serveur tourne sur Redhat 5.4.
Gôm
#29 Optimisation » Quelle quantité de RAM allouer ? » 30/01/2013 12:56:31
- gom
- Réponses : 5
Bonjour,
Question simple et courte : pourquoi le serveur de Prod de mon client a un shared_buffers à 2GB alors que le serveur (dédié avec seulement la base de Prod) possède 8GB de RAM ?
# - Connexions -
listen_addresses = ’*’
# - Memoire -
shared_buffers = 2GB
wal_buffers = 8MB
work_mem = 300MB
maintenance_work_mem = 512MB
# - Journaux de transactions -
checkpoint_segments = 50
checkpoint_timeout = 10min
checkpoint_completion_target = 0.9
# - Optimiseur -
effective_cache_size = 5376MB
random_page_cost = 2.0
# - Statistiques -
track_activity_query_size = 4096
# - Traces -
log_filename = ’postgresql-%Y-%m-%d.log’
log_truncate_on_rotation = off
log_line_prefix = ’%t [%p] : [%l-1] ’
lc_messages = ’C’
log_checkpoints = on
log_lock_waits = on
log_temp_files = 0
log_autovacuum_min_duration = 0
# - Module pg_stat_statements -
shared_preload_libraries = ’pg_stat_statements’
custom_variable_classes = ’pg_stat_statements’
pg_stat_statements.max = 1000
pg_stat_statements.track = top
pg_stat_statements.save = on
Merci d'éclairer ma lanterne ! ![]()
Gôm
#30 Re : Général » pgdump sans index ? » 21/01/2013 19:08:50
Aïe je pensais pouvoir restaurer ma base sans les index et "relancer le pg_restore" uniquement pour la création d'index.
Est-ce possible sans éditer le dump en le coupant en 2 ?
#31 Re : Général » pgdump sans index ? » 21/01/2013 16:56:08
Je pensais avoir la place de faire ma restauration étant donné que les index sont à calculés après coup. J'ai faux ? ![]()
#32 Re : Général » pgdump sans index ? » 21/01/2013 15:31:48
Vous ne pouvez pas vous en assurer, à moins de connaître la taille de la base au final.
661 Go avec les index.
#33 Re : Général » pgdump sans index ? » 21/01/2013 13:01:00
Je me suis mal exprimé : 637 - 537 = 100 Go de dispo théoriquement, alors que seuls 69 Go sont affichés. (J'ai édité mon précédent post.)
Si je veux relancer ma restauration, comment puis-je m'assurer de ne pas avoir à nouveau l'erreur ?
ERREUR: n'a pas pu étendre la relation base/19635/1259 : Aucun espace disponible sur le périphérique
#34 Re : Général » pgdump sans index ? » 21/01/2013 12:48:59
Comment ça du ménage "par lui" ?
Sinon je constate que Linux me dit que j'occupe 89% d'espace disque pour cette partition, alors que 637-537 = 100 Go de dispo signifie plutôt qu'il me reste plus de 15% de libre, donc que j'occuperais 84% et quelques, et non 89% ?! ![]()
[root@monserveur backups_prod]# df -h
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/sda1 2,0G 271M 1,6G 15% /
/dev/mapper/vg_root-lv_sigexpl
496M 19M 452M 4% /sigexpl
/dev/mapper/vg_root-lv_tmp
992M 34M 908M 4% /tmp
/dev/mapper/vg_root-lv_app
9,7G 3,6G 5,7G 39% /app
/dev/mapper/vg_root-lv_home
2,0G 68M 1,8G 4% /home
/dev/mapper/vg_root-lv_usr
4,9G 1,3G 3,4G 27% /usr
/dev/mapper/vg_root-lv_var
4,9G 295M 4,4G 7% /var
tmpfs 12G 0 12G 0% /dev/shm
/dev/mapper/vg_root-lv_pgdata
637G 537G 69G 89% /app/pgdata
#35 Re : Général » pgdump sans index ? » 21/01/2013 10:56:24
Bonjour,
Merci.
J'ai encore un problème ... j'ai à priori saturé l'espace disque :
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 4148 ; 0 0 ACL table_1 user_dwh
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: n'a pas pu étendre la relation base/19635/1259 : Aucun espace disponible sur le périphérique
ASTUCE : Vérifiez l'espace disque disponible.
Command was: REVOKE ALL ON TABLE table_1 FROM PUBLIC;
REVOKE ALL ON TABLE table_1 FROM user_dwh;
GRANT ALL...
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 4149 ; 0 0 ACL table_2 user_dwh
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: n'a pas pu étendre la relation base/19635/1259 : Aucun espace disponible sur le périphérique
ASTUCE : Vérifiez l'espace disque disponible.
Command was: REVOKE ALL ON TABLE table_2 FROM PUBLIC;
REVOKE ALL ON TABLE table_2 FROM user_dwh...
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 4150 ; 0 0 ACL pg_stat_statements postgres
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: la relation « pg_stat_statements » n'existe pas
Command was: REVOKE ALL ON TABLE pg_stat_statements FROM PUBLIC;
REVOKE ALL ON TABLE pg_stat_statements FROM postgres;
GRANT ALL ON TABLE...
ATTENTION : erreurs ignorées lors de la restauration : 800
Ces commandes me disent que "non" je n'ai pas saturé le disque ! Je ne comprends pas (oui encore !). ![]()
[root@monserveur backups_prod]# fdisk -l
Disque /dev/sda: 730.8 Go, 730815528960 octets
255 heads, 63 sectors/track, 88849 cylinders
Unités = cylindres de 16065 * 512 = 8225280 octetsPériphérique Amorce Début Fin Blocs Id Systême
/dev/sda1 * 1 261 2096451 83 Linux
/dev/sda2 262 88849 711583110 8e Linux LVM
[root@monserveur backups_prod]# mount
/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/mapper/vg_root-lv_sigexpl on /sigexpl type ext3 (rw,noatime)
/dev/mapper/vg_root-lv_tmp on /tmp type ext3 (rw,noatime)
/dev/mapper/vg_root-lv_app on /app type ext3 (rw,noatime)
/dev/mapper/vg_root-lv_home on /home type ext3 (rw,noatime)
/dev/mapper/vg_root-lv_usr on /usr type ext3 (rw,noatime)
/dev/mapper/vg_root-lv_var on /var type ext3 (rw,noatime)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/vg_root-lv_pgdata on /app/pgdata type ext3 (rw,noatime)
[root@monserveur backups_prod]# du / -s -h
542G /
[root@monserveur backups_prod]# du /app -s -h
540G /app
[root@monserveur backups_prod]# du /app/pgdata -s -h
537G /app/pgdata
[root@monserveur backups_prod]# du /app/pgdata/backups_prod/ -s -h
410G /app/pgdata/backups_prod/
[root@monserveur backups_prod]# du /app/pgdata/base -s -h
127G /app/pgdata/base
[root@monserveur backups_prod]# df
Sys. de fich. 1K-blocs Occupé Disponible Capacité Monté sur
/dev/sda1 2030736 276512 1649404 15% /
/dev/mapper/vg_root-lv_sigexpl
507748 18768 462766 4% /sigexpl
/dev/mapper/vg_root-lv_tmp
1015704 34108 929168 4% /tmp
/dev/mapper/vg_root-lv_app
10157368 3673332 5959748 39% /app
/dev/mapper/vg_root-lv_home
2031440 68720 1857864 4% /home
/dev/mapper/vg_root-lv_usr
5078656 1281392 3535120 27% /usr
/dev/mapper/vg_root-lv_var
5078656 301344 4515168 7% /var
tmpfs 12337992 0 12337992 0% /dev/shm
/dev/mapper/vg_root-lv_pgdata
667880040 562492588 71469132 89% /app/pgdata
Gôm
#36 Re : Général » pgdump sans index ? » 20/01/2013 22:29:53
Le contrib pg_stat_statement est installé sur le serveur de départ, mais pas sur celui d'arrivée (il doitmanquer le packages de contribs postgres sur le serveur d'arrivée). Si vous voulez l'activer sur le serveur d'arrivée il faudra aussi le mettre dans shared_preload_libraries, dans le fichiers postgresql.conf, comme sur le serveur de départ.
Bonjour,
Est-ce que cela empêche la restauration des données ?
Je ne peux malheureusement pas me connecter pour l'instant pour m'en assurer avec pg_stat_activity.
Merci messieurs pour votre aide ! ![]()
Et c'est bien noté pour le pg_dumpall ! ![]()
Gôm
#37 Re : Général » pgdump sans index ? » 18/01/2013 18:59:50
Dernière question ... comment savoir si les données sont en train d'être chargées ? En bref : suivre la restauration des données.
Le "psql -l" m'a effectivement permis de constater que ma base a bien été créée. Merci Marc ! ![]()
#38 Re : Général » pgdump sans index ? » 18/01/2013 18:53:49
Merci Guillaume.
Le problème est que j'ai eu à créer tous les users et les répertoires pour les tablespaces ... sinon le restore fonctionnait pas ... "forcément" vous allez dire, mais fallait-il encore savoir que pg_restore n'allait pas le faire. Encore que pour les tablespaces j'aurais pu m'en douter ! ![]()
Bon par contre j'ai encore des erreurs, qu'en pensez-vous ?
[root@monserveur pgdata]# pg_restore mabase_infocentre_20121211.tar -U postgres -C -d postgres
pg_restore: [archiveur] n'a pas pu ouvrir le fichier en entrée « mabase_infocentre_20121211.tar » : Aucun fichier ou répertoire de ce type
[root@monserveur pgdata]# pg_restore backups_prod/mabase_infocentre_20121211.tar -U postgres -C -d postgres
pg_restore: [programme d'archivage (db)] Erreur pendant le traitement de la TOC (« PROCESSING TOC ») :
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 32 ; 1255 17753 FUNCTION pg_stat_statements() postgres
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: n'a pas pu accéder au fichier « $libdir/pg_stat_statements » : Aucun fichier ou répertoire de ce type
Command was: CREATE FUNCTION pg_stat_statements(OUT userid oid, OUT dbid oid, OUT query text, OUT calls bigint, OUT total_time double pre...
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: la fonction public.pg_stat_statements() n'existe pas
Command was: ALTER FUNCTION public.pg_stat_statements(OUT userid oid, OUT dbid oid, OUT query text, OUT calls bigint, OUT total_time doub...
pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 33 ; 1255 17752 FUNCTION pg_stat_statements_reset() postgres
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: n'a pas pu accéder au fichier « $libdir/pg_stat_statements » : Aucun fichier ou répertoire de ce type
Command was: CREATE FUNCTION pg_stat_statements_reset() RETURNS void
LANGUAGE c
AS '$libdir/pg_stat_statements', 'pg_stat_stateme...
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: la fonction public.pg_stat_statements_reset() n'existe pas
Command was: ALTER FUNCTION public.pg_stat_statements_reset() OWNER TO postgres;pg_restore: [programme d'archivage (db)] Erreur à partir de l'entrée TOC 2636 ; 1259 17754 VIEW pg_stat_statements postgres
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: la fonction pg_stat_statements() n'existe pas
LIGNE 2 : ...atements.total_time, pg_stat_statements.rows FROM pg_stat_st...
^
ASTUCE : Aucune fonction ne correspond au nom donné et aux types d'arguments.
Vous devez ajouter des conversions explicites de type.
Command was: CREATE VIEW pg_stat_statements AS
SELECT pg_stat_statements.userid, pg_stat_statements.dbid, pg_stat_statements.query, p...
pg_restore: [programme d'archivage (db)] could not execute query: ERREUR: la relation « public.pg_stat_statements » n'existe pas
Command was: ALTER TABLE public.pg_stat_statements OWNER TO postgres;
#39 Re : Général » pgdump sans index ? » 18/01/2013 17:46:12
Merci Marc !
J'ai donc lancé cette commande (après avoir édité mon "postgresql.conf" et fait un reload) :
pg_restore mabase_infocentre_20121211.tar -U postgres -CComment savoir si ma base a bien été créée au début de la restauration et que maintenant les données sont en train d'être restaurées ?
Gôm
#40 Re : Général » pgdump sans index ? » 18/01/2013 16:50:08
Sinon (plus simple), je peux faire ça, non ?
pg_restore mabase_infocentre_20121211.tar -C -U postgres -w#41 Re : Général » pgdump sans index ? » 18/01/2013 16:36:13
Cette commande est bonne ?
pg_restore mabase_infocentre_20121211.tar -U postgres -w -d mabase_infocentreJ'ai retrouvé un paramétrage que vous m'aviez donné en 2010.
# - Specifique restauration -
fsync = off
checkpoint_segments = 200
checkpoint_timeout = 20min
maintenance_work_mem = 1GB
Est-il toujours valable ? Puis-je le mettre en place simplement en éditant "postgresql.conf" ?
Comment savoir quelles bases sont présentes sur mon serveur (en lignes de commandes Linux) ?
#42 Re : Général » pgdump sans index ? » 18/01/2013 16:17:58
Bonjour,
La commande a pu être passée chez le client sans problème particulier ... par contre la restauration a été une autre histoire !
Il m'a été impossible de déchiffrer le dump à partir du compte root. Je ne sais toujours pas pourquoi ... personne en interne n'a été capable de m'aider. J'ai donc copier le dump sur un serveur Windows où j'ai installé PGP et j'ai déchiffré sur Windows ... avant de tout renvoyer sur le serveur Linux !! ![]()
Au final la restauration a duré 6 jours ... oui oui 6 jours (sans compter le temps de déchiffrage et de décompression) ! Tout le contenu du dump s'affichait sur la sortie standard. Je ne sais pas si c'est normal. ![]()
J'ai restauré ainsi :
pg_restore mabase_infocentre_20121211.tar -U postgres -wAi-je fait une erreur n'y avait-il pas un moyen d'accélérer les choses ?
2ème et dernière question : comment se fait-il que je ne puisse pas accéder à la base que je viens de restaurer ? Le user qui a été restauré en même temps que la base n'est, apparemment, pas utilisable depuis PgAdmin sur mon PC sous Windows. Je ne peux utiliser que le user "postgres", le problème est que ce user n'a accès qu'à la base "postgres".
Que dois-je modifier pour que mon user "user_infocentre" soit utilisable depuis mon PC ?
Merci d'avance ! ![]()
Gôm
#43 Re : Optimisation » Requête à optimiser » 18/01/2013 15:13:24
Désolé moi aussi pour le temps de réponse !
Le problème est résolu grâce à un changement fonctionnel. Techniquement rien n'a pu être fait pour améliorer les choses !
#44 Re : Optimisation » Requête à optimiser » 28/12/2012 19:05:53
J'ai fait ça :
DROP INDEX index_cible;
VACUUM FULL ANALYZE table_cible;
CREATE INDEX index_cible
ON table_cible
USING btree
(anneesem);Malheureusement, j'ai peur que cela ne change rien, parce qu'en fait si le plan d'exécution change c'est simplement par que les semaines dont je parlais n'existent pas dans la table ! ![]()
anneesem;count(*)
"2012S51";145345
"2012S50";146918
"2012S49";145560
"2012S48";143669
"2012S47";142365
"2012S46";142066
"2012S45";142442
"2012S44";140548
#45 Re : Optimisation » Requête à optimiser » 28/12/2012 18:40:56
Non je n'ai pas essayé.
Faire un "VACUUM ANALYZE table_cible" ?
#46 Re : Optimisation » Requête à optimiser » 28/12/2012 18:20:17
Bonjour,
PostgreSQL n'essaye pas de déduire des informations dues à la transitivité des opérateurs, pour les inégalités. Il ne le fait que pour les égalités.
Il ne va pas déduire de
join table_source b on (a.code = b.code and '2011S02' <= b.annee_semaine and b.annee_semaine <= a.annee_semaine)
where a.annee_semaine = '2012S01'que
b.annee_semaine <= '2012S01'
Je ne suis pas sûr que ça puisse avoir un impact énorme sur la requête, mais pouvez-vous essayer de remplacer a.annee_semaine par '2012S01' dans la clause de jointure, et réessayer (et nous montrer le nouveau plan) ?
Non cela ne change rien ... malheureusement !
Voici 2 explain (les explain analyze sont en cours) de la même requête mais avec une condition différente.
Temps de réponse catastrophiques ! ![]()
"Bitmap Heap Scan on table_cible aa (cost=2231.66..7442511.43 rows=143138 width=60)"
" Recheck Cond: ((anneesem)::text = '2012S44'::text)"
" -> Bitmap Index Scan on index_cible (cost=0.00..2195.88 rows=143138 width=0)"
" Index Cond: ((anneesem)::text = '2012S44'::text)"
" SubPlan 1"
" -> GroupAggregate (cost=0.00..51.87 rows=1 width=26)"
" -> Result (cost=0.00..51.84 rows=2 width=26)"
" One-Time Filter: (($1)::text = '2012S44'::text)"
" -> Nested Loop (cost=0.00..51.84 rows=2 width=26)"
" -> Index Scan using index_source on table_source a (cost=0.00..24.89 rows=1 width=22)"
" Index Cond: (((dwh_gtin)::text = ($0)::text) AND ((dwh_anneesem)::text = '2012S44'::text))"
" -> Index Scan using index_source on table_source b (cost=0.00..26.93 rows=2 width=26)"
" Index Cond: (((b.dwh_gtin)::text = ($0)::text) AND ('2012S45'::text <= (b.dwh_anneesem)::text) AND ((b.dwh_anneesem)::text <= (a.dwh_anneesem)::text))"Temps de réponse exceptionnels !!
Mais pourquoi ?! ![]()
"Index Scan using index_cible on table_cible aa (cost=0.00..56.24 rows=1 width=60)"
" Index Cond: ((anneesem)::text = '2012S43'::text)"
" SubPlan 1"
" -> GroupAggregate (cost=0.00..51.87 rows=1 width=26)"
" -> Result (cost=0.00..51.84 rows=2 width=26)"
" One-Time Filter: (($1)::text = '2012S43'::text)"
" -> Nested Loop (cost=0.00..51.84 rows=2 width=26)"
" -> Index Scan using index_source on table_source a (cost=0.00..24.89 rows=1 width=22)"
" Index Cond: (((dwh_gtin)::text = ($0)::text) AND ((dwh_anneesem)::text = '2012S43'::text))"
" -> Index Scan using index_source on table_source b (cost=0.00..26.93 rows=2 width=26)"
" Index Cond: (((b.dwh_gtin)::text = ($0)::text) AND ('2012S44'::text <= (b.dwh_anneesem)::text) AND ((b.dwh_anneesem)::text <= (a.dwh_anneesem)::text))"La seule différence est que la deuxième requête a comme condition '2012S43' sur "table_cible". J'obtiens le même plan d'exécution pour toutes les semaines antérieures à '2012S43' jusqu'à '2012S01'.
Le passage à la semaine '2012S44' serait la goutte qui fait déborder le vase imploser PostgreSQL ?!
Gôm
#47 Re : Général » Estimer la fragmentation (en pourcentage) de tous mes index ? » 12/12/2012 01:05:53
Merci.
Etant en version 8.4 "basique" je dois commencer par installer cette extension. C'est bien cela ?
http://www.postgresql.org/docs/8.4/static/contrib.html
Gôm
#48 Général » Estimer la fragmentation (en pourcentage) de tous mes index ? » 11/12/2012 18:17:37
- gom
- Réponses : 4
Bonjour,
Savez-vous si c'est possible via une requête SQL ?
Je sais le faire en SQL Server mais pas en PostgreSQL. ![]()
J'ai bien lu ça : http://www.dalibo.org/glmf109_operation … postgresql, puis ça : http://blog.guillaume.lelarge.info/inde … gstattuple mais ça ne répond pas à mon besoin.
Gôm
#49 Re : Général » pgdump sans index ? » 30/11/2012 19:03:23
La commande ne peut pas aller à son terme je n'ai pas assez d'espace disque sur mon serveur de tests. Tant pis je vais livrer la commande et le client va la tester sur son serveur de Recette.
Merci pour tout. ![]()
Gôm
#50 Re : Général » pgdump sans index ? » 29/11/2012 13:02:01
Mon fichier ne fait que 459 Ko (ou 459 Mo ?) ? Si c'est ça alors l'espace disque restant sur mon serveur est un peu inquiétant, non ?!!
Gôm