Vous n'êtes pas identifié(e).

#76 Re : Général » Prise en compte d'un index par le planificateur » 23/08/2019 13:32:27

Lors de la première requête, le planificateur n'a visiblement pas de statistiques sur le contenu de la table, c'est pourquoi il choisit un Seq Scan.
Le processus autovacuum met à jour en tâche de fond les statistiques, mais s'il n'a pas eu le temps de passer et que la table est requêtée immédiatement après avoir été chargée, ça donne ce genre de plan.

Dans ce cas de figure, il faut faire un ANALYZE table après le chargement. Un VACUUM FULL ANALYZE  calcule aussi ces stats mais il réécrit aussi toute la table, ce qui est beaucoup plus coûteux et inutile si on veut juste les stats.

#77 Re : Général » delete doublon dans une table » 22/08/2019 18:28:46

La syntaxe DELETE avec un JOIN est typique de MySQL et n'existe pas dans PostgreSQL. Pour éliminer les lignes qui ont le même theme_lib en gardant le theme_id le plus petit, ça pourrait être écrit avec une auto-jointure comme ça dans PostgreSQL:

DELETE FROM theme t1
USING theme t2
WHERE t1.theme_lib = t2.theme_lib
AND t1.theme_id > t2.theme_id;

#78 Re : PL/pgSQL » LEFT OUTER JOIN, WHERE et un POSIX » 19/08/2019 21:03:04

Je veux bien la différence entre un LEFT JOIN et un OUTER LEFT JOIN ?

Il n'y a pas de différence entre T1 LEFT JOIN T2 et T1 LEFT OUTER JOIN T2, de même qu'il n'y a pas de différence entre T1 JOIN T2 et T1 INNER JOIN T2. Pareil pour RIGHT JOIN versus RIGHT OUTER JOIN.

Les mots OUTER et INNER sont optionnels parce que quand il y a LEFT ou RIGHT (ou FULL) c'est forcément une jointure externe, et quand il n'y a ni LEFT ni RIGHT c'est forcément une jointure interne.

#79 Re : Migration » Impossibe d'appliquer le patch 9.6.14 sur ubuntu 14.04 » 19/08/2019 16:16:22

C'est aussi vérifiable dans le détail via le dépôt git des sources de pgapt:

https://git.postgresql.org/gitweb/?p=pg … a=shortlog

Le nom de code de 14.04 est "trusty" et on voit qu'il a été éliminé des versions supportées le 14 mai précisément:

https://git.postgresql.org/gitweb/?p=pg … 6ab5074232

#80 Re : Migration » Impossibe d'appliquer le patch 9.6.14 sur ubuntu 14.04 » 07/08/2019 17:40:05

Ubuntu 14.04 a une durée de vie de cinq ans, elle est sortie en avril 2014, donc plus de maintenance depuis avril 2019.
Je pense que c'est pour ça que les mises à jour PostgreSQL post-avril 2019 ne sont pas disponibles en paquets.

#81 Re : Optimisation » perte de performances près modification de configuration » 19/07/2019 17:51:42

coucou78187 a écrit :

je trace aussi les fichiers temp dans les logs, à priori ca arrive bien dans les logs :

LOG:  temporary file: path "base/pgsql_tmp/pgsql_tmp16217.8", size 97097841

Ca je n'en doutais pas mais ce n'est pas ce que je voulais dire en disant que le contenu temporaire à durée de quelques secondes ne va pas forcément physiquement sur les disques.

Prenons un exemple sous Linux avec 32Go de RAM, et un FS ext4 basique.

Je créé un fichier random de 100Mo:
$ dd if=/dev/urandom of=file bs=1024 count=$((100*1024))

Mettons maintenant que je le copie en regardant à côté avec vmstat les accès sur l'interface disque.

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0   8256 382924 1133884 30858356    0    0     0     0   68   85  0  0 100  0  0
0  0   8256 382924 1133884 30858356    0    0     0     0   46   56  0  0 100  0  0
... pas mal de secondes plus tard...
0  0   8256 382180 1133884 30858356    0    0     0 102555  310  219  0  0 99  1  0
0  0   8256 382180 1133884 30858360    0    0     0     6  238   93  0  0 100  0  0
1  0   8256 382180 1133884 30858360    0    0     0     0   66   69  0  0 100  0  0
0  0   8256 382312 1133884 30858360    0    0     0    19   98  138  0  0 100  0  0

Au bout d'un moment on voit passer les 100Mo en colonne "bo" qui correspond à l'écriture physique, c'est le 102555 en l'occurrence.

Mais qu'est-ce qui se passe si on fait "cp file file2 ; sleep 3; rm file2" c.a.d que le fichier est détruit au bout de quelques secondes?
Et bien typiquement cette ligne dans vmstat n'apparait jamais, car les données ont été abandonnées avant que le cache soit vidé sur disque. En vrai tout s'est passé en mémoire.


Dans le cas d'un petit fichier de 100Mo écrits dans base/pgsql_tmp, vu que postgres n'a pas de raison de demander un "fsync" sur ce fichier qui n'a pas à survivre à la transaction, je ne vois pas pourquoi l'OS se précipiterait pour l'écrire physiquement sur disque.

#82 Re : Optimisation » perte de performances près modification de configuration » 19/07/2019 16:25:04

rjuju a écrit :

Concernant le sort, je confirme que vos résultats indique que le tri est plus rapide avec un external sort.  Pour analyser la sortie d'explain:

les différents temps d'exécution sont:

- récupération de l'intégralité des lignes + temps pour trier les lignes : temps total du noeud sous jacent - temps initial du noeud sort, soit ici 6157.823 - 3674.164
- temps pour renvoyer toutes les lignes au noeud parent : temps total du noeud sort - temps initial du noeud sort, soit ici 7029.107 - 6157.823

Oui je me suis trompé dans mon message précédent en confondant le temps mesuré à partir de la 1ere ligne sortie avec le temps total du tri. Autant pour moi. Concernant la lenteur du quicksort, cet algorithme a des cas dégénérés où il est peu performant en O(n²), peut-être effectivement que le profil des données en entrée fait qu'il se retrouve dans ce cas là.

#83 Re : Optimisation » perte de performances près modification de configuration » 19/07/2019 14:28:09

Si on regarde exactement le noeud de tri dans les 2 cas, via le explain analyze:
Cas 1:

work_mem = '8MB';


GroupAggregate  (cost=2023043.46..2063380.33 rows=407047 width=85) (actual time=6157.856..7899.641 rows=467497 loops=1)
   Group Key: r.colonne2, r.colonne4, r.colonne3
   Buffers: shared hit=574976, temp read=11850 written=11869
   ->  Sort  (cost=2023043.46..2026340.41 rows=1318778 width=81) (actual time=6157.823..7029.107 rows=988089 loops=1)
         Sort Key: r.colonne2, r.colonne4, r.colonne3
         Sort Method: external merge  Disk: 94800kB


7029 - 6157 = 870 ms pour faire le tri


Cas 2:

  set work_mem = '4GB';

GroupAggregate  (cost=1987074.38..2027412.90 rows=407047 width=85) (actual time=8889.551..10203.305 rows=467497 loops=1)
   Group Key: r.colonne2, r.colonne4, r.colonne3
   Buffers: shared hit=574976
   ->  Sort  (cost=1987074.38..1990371.48 rows=1318838 width=81) (actual time=8889.511..9224.192 rows=988089 loops=1)
         Sort Key: r.colonne2, r.colonne4, r.colonne3
         Sort Method: quicksort  Memory: 163527kB
         Buffers: shared hit=574976


9224 - 8889 = 335 ms pour faire le tri


Le tri lui-même est plus rapide en mémoire que sur disque, conformément à ce qu'on peut attendre.

Au moment de commençer le tri, la requête avec le work_mem à 4GB semble déjà bien en retard par rapport à l'autre configuration, et c'est ce retard là qui semble jouer dans la différence totale entre les deux requêtes, plus que l'étape de tri.

Mais il y a une chose qui n'est pas claire pour moi, c'est si vous comparez uniquement des work_mem différents ou si vous comparez toujours deux configurations différentes sur de multiples paramètres comme au début du post.

#84 Re : Optimisation » perte de performances près modification de configuration » 19/07/2019 13:13:43

le phénomène que je n'arrive pas a expliquer par ailleurs est le fait qu'un "external merge  Disk" soit plus rapide qu'un "quicksort  Memory" car c'est sur ce noeud que ce joue une partie de la différence...

La machine a seulement 32GB, donc ces allocations de 4GB posent peut-être des difficultés à l'OS qui l'obligent à écrire des buffers disque en urgence pour libérer de la mémoire ou à swapper. Surtout si les 4GB se trouvent multipliés puisque comme dit la doc:

De plus, de nombreuses sessions peuvent exécuter de telles opérations simultanément. La mémoire totale utilisée peut, de ce fait, atteindre plusieurs fois la valeur de work_mem ; il est nécessaire de garder cela à l'esprit lors du choix de cette valeur.

Là vous faites peut-être des tests sur un serveur isolé, mais dans une utilisation normale, mettre 1/8 de la RAM dans le postgresql.conf pour work_mem est une mauvaise idée. Si une requête a besoin d'un work_mem particulier, on peut faire un SET work_mem TO valeur dans la session pour limiter le champ d'application à cette session.


Par ailleurs la partie écrite sur disque dans le cas du "external merge Disk" n'est pas énorme, moins de 100MB apparemment, un SSD peut faire ça en une fraction de seconde, et est-ce que ces données temporaires qui ne sont utilisées que quelques secondes atterrissent physiquement sur le disque d'ailleurs? Si ça se trouve, tout se passe en cache disque.


Si le quick sort s'avère consommer 167 MB pourquoi ne pas réessayer avec un work_mem beaucoup plus proche de cette valeur plutôt que 4GB ?

#85 Re : Installation » plusieurs version de postgres sur un même poste » 11/07/2019 17:17:47

Oui il est tout à fait possible d'avoir plusieurs versions en même temps. Effectivement il faut un port différent pour chaque, un répertoire de données différent pour chaque, et il faut faire attention à ce que shared_buffers (cache mémoire global par instance) ne soit pas trop élevé, puisque c'est une zone de mémoire contigüe qui est allouée par instance et libérée seulement quand l'instance  quitte. Si vous n'avez pas besoin des différentes instances en même temps, vous pouvez les mettre en démarrage manuel dans le gestionnaire de services.

#86 Re : Sécurité » Certificat SHA-256 et version de postgreSQL compatible » 09/07/2019 12:23:32

Ce problème "pending-data buffer contains an exact multiple of 256 bytes" n'a pas de rapport techniquement avec le fait que des certificats aient une signature sha-256 plutôt que sha-1.


Les signatures sha-256 sont censées être supportées par toutes les versions de PostgreSQL parce que c'est OpenSSL qui gère ça, pas PostgreSQL à proprement parler.


L'explication la plus plausible pour un certificat non accepté est une erreur de déploiement des fichiers. Ou éventuellement une version d'OpenSSL trop ancienne sur le client ou le serveur, mais ça fait des années que sha-256 est géré.

#87 Re : Général » fonction update n'est pas mise à jour dans une boucle » 04/07/2019 15:58:23

Il semble que le besoin de votre fonction soit schématiquement:


Tant qu'il y a des enregistrements qui vérifient certains critères
     faire certains traitements susceptibles de modifier ces enregistrements

Et donc la condition "tant que" serait à réévaluer à chaque fois.

La boucle FOR n'est pas spécialement adaptée à ça, mais il y a d'autres types de boucle
et structures de contrôle qui peuvent être plus appropriées:

https://docs.postgresql.fr/11/plpgsql-c … tures.html

#88 Re : Général » fonction update n'est pas mise à jour dans une boucle » 02/07/2019 17:25:38

Il n'y a pas de boucles en SQL, donc les boucles FOR sont des extensions procédurales qui sont plus ou moins différentes dans chaque SGBD.

A propos du fait qu'il n'y a pas de boucle, la logique itérative dans l'exemple avec la boucle FOR interne devrait être repensée différemment.
C'est-à-dire que si on considère

FOR variable in SELECT ... FROM T2.. WHERE...
  LOOP
   UPDATE T2 SET.. etc....
  END LOOP;

En logique SQL qui n'essaie pas de dupliquer la pensée procédurale,  tout ça devrait être un seul UPDATE qui fait les mises à jour nécessaires sur les lignes concernées en une seule fois, avec comme conséquence qu'il n'y a plus de question de réévaluation ou pas des critères de la boucle FOR à chaque tour, puisqu'il n'y a plus de boucle FOR.

#89 Re : Général » fonction update n'est pas mise à jour dans une boucle » 02/07/2019 15:42:24

Pour ajouter je veux que les modifications faites dans la 2ème boucle, soient perceptible au niveau de la 1ère boucle :

Ce n'est toujours pas clair parce que l'expression "pris en compte" reste à interpréter. Il serait peut être utile d'ajouter des raise notice dans ce code pour pouvoir dire à tel moment la valeur de telle variable est X alors qu'elle devrait être Y.

Je suspecte qu'il y a une confusion sur le fait que le SELECT derrière une boucle FOR n'est exécuté qu'une seule fois, et que les valeurs qu'il délivre sont pré-établies à ce moment là indépendamment ce qui se passe dans la boucle. Voici un exemple qui illustre ça:

create table list(x int);

insert into list values (1),(2),(3),(4);

do $$
declare i integer;

begin
  for i in select x from list
  loop
   raise notice 'i=%', i;
   update list set x=10;
   i:=12;
  end loop;
end
$$ language plpgsql;

Ici dans la boucle la variable de boucle est modifiée, ainsi que l'intégralité du contenu de la table sur laquelle on boucle.
Et ca n'a aucun effet sur les valeurs de i au tour suivant de la boucle, dans le sens où la sortie est :

NOTICE:  i=1
NOTICE:  i=2
NOTICE:  i=3
NOTICE:  i=4

Et si ce select avait une clause WHERE dont les valeurs changent dans la boucle, ce serait pareil. La clause WHERE ne serait pas réévaluée.

#90 Re : Général » Arrêter le service postgresql.service pour de bon » 27/06/2019 17:38:19

Je ne connaissais pas cette méthode avec policy-rc.d. Je ne suis pas sûr que ce soit la même situation que pour ced parce que son pg_upgrade a l'air manuel (=pas automatiquement déclenché par un upgrade de package). Modulo le fait que de toute manière je ne comprends pas pourquoi systemd fait ce qui est décrit au départ de ce post.

#91 Re : Général » Arrêter le service postgresql.service pour de bon » 27/06/2019 16:00:21

Je ne suis pas certain que ça fonctionne (et je trouve ce redémarrage automatique un peu surprenant)
mais personnellement j'aurais tendance à voir plutôt par là:

(extrait de man pg_ctlcluster):

/etc/postgresql/cluster-version/cluster-name/start.conf
           This configuration file controls the start/stop behavior of the
           cluster. See section "STARTUP CONTROL" in pg_createcluster(8) for
           details.

et mettre provisoirement "disabled" dans le fichier, vu que (cf man pg_createcluster):

disabled
           Neither the init script, pg_ctlcluster(1), nor postgresql@.service
           are permitted to start/stop the cluster. Please be aware that this
           will not stop the cluster owner from calling lower level tools to
           control the postgres process; this option is only meant to prevent
           accidents during maintenance, not more.

#92 Re : Site PostgreSQL.fr » Contexte des messages RAISE NOTICE » 14/06/2019 13:08:35

Mlan2 a écrit :

J'ai positionné la valeur de ce paramètre à terse, mais cela n'a pas d'effet sur l'aspect verbeux des messages.

C'est côté client donc. Si c'est psql, voir les variables VERBOSITY et SHOW_CONTEXT. Par défaut le contexte ne devrait pas s'afficher avec RAISE NOTICE.

#93 Re : Général » Problème d'accessibilité » 29/05/2019 17:39:05

La sécurité par défaut sous Debian est en principe que l'utilisateur système postgres peut se connecter sans mot de passe avec l'utilisateur de base de données du même nom. Ensuite il peut créer d'autres utilisateurs avec CREATE USER ou d'autres bases avec CREATE DATABASE et mettre des droits à ces utilisateurs avec GRANT. La gestion de tout cet aspect est assez différente de mysql et les connaissances mysql ne servent pas à grand chose, il faut regarder la doc de PostgreSQL ou trouver des tutos si la doc vous paraît trop peu didactique.


En tout cas pour se connecter, en partant d'un compte root, faire "su - postgres" puis simplement "psql"

#94 Re : PSQL » Cmde CREATE PROFILE » 22/05/2019 15:34:09

jeromedb19 a écrit :

Effectivement c'est un code provenant de edb. Merci bien.
Comment trouver les différences entre Postgres et une version edb ?

C'est le propos de https://www.enterprisedb.com/compare-postgres-databases

#95 Re : PSQL » Cmde CREATE PROFILE » 22/05/2019 13:05:43

Cette commande CREATE PROFILE existe dans Oracle mais pas dans PostgreSQL.

Elle peut exister dans le fork commercial de PostgreSQL fait par EntrepriseDB qui sert justement à être plus proche d'Oracle.

Voir https://www.enterprisedb.com/compare-postgres-databases

#96 Re : PL/Tcl » problème pour charger pl/tcl » 20/05/2019 13:31:49

Sinon il est possible que la DLL non trouvée soit une dépendance de pltcl.dll.
De mémoire, le message d'erreur de Windows dans ce cas n'aide pas trop puisqu'il n'indique pas la dépendance manquante.

Dans ce genre de cas, ces deux outils https://docs.microsoft.com/en-us/sysint … s-explorer et https://docs.microsoft.com/en-us/sysint … ds/procmon peuvent être bien utiles.

#97 Re : Général » Lancement de commandes psql parallélisées. » 13/05/2019 19:44:56

Le modèle de PostgreSQL c'est qu'il y a un processus par connexion, donc si N instances psql sont en parallèle, il y a N processus côté serveur (sauf s'il y a un pooler de connexion qui dit le contraire).


Après ce que font ces processus c'est une autre affaire. S'il se trouve que des sessions en verrouillent d'autres, il peut y avoir N-1 processus qui attendent et un seul qui travaille. Il faut regarder dans le détail, via la vue pg_stat_activity par exemple.

#98 Re : PL/pgSQL » shell commande \copy sans être superuser » 06/05/2019 13:51:17

Cependant c'est fragile parce que s'il y a des antislashes dans le fichier, ils vont être interprétés par COPY, et aussi parce qu'à la restitution, il manque un tri des lignes dans l'ordre où elles étaient dans le fichier.

Le 2nd problème peut se régler en ajoutant une colonne de numéro de ligne auto-incrémentée et une clause ORDER BY dans le string_agg, mais le premier problème est plus ennuyeux. COPY est fait pour les formats tabulaires, pas pour gober un fichier sans format particulier (d'ailleurs c'est pas faute d'avoir essayé de l'ajouter à Postgres, mais ça a été rejeté). Le plus simple c'est qu'un client SQL importe ce fichier en base en le formattant comme il faut, par opposition au fait que le serveur ait l'initiative de l'import.

#99 Re : PL/pgSQL » Débutant: function me permettant de remplir un champs » 06/05/2019 13:31:55

Un UPDATE sans clause WHERE met à jour toute la table.
Donc ici toutes les lignes sont mises à jour à chaque tour de boucle, écrasant toutes les valeurs précédentes.

En base de données les lignes des tables n'ont pas de numéro intrinsèque, donc il n'y a pas de ligne 1, ligne 2, etc. sauf à les numéroter de manière complètement arbitraire. Il faudrait plutôt utiliser la clef primaire de la table pour indiquer que telle ligne doit être mise à jour avec telle valeur.

#100 Re : PL/pgSQL » shell commande \copy sans être superuser » 26/04/2019 16:31:16

Je soupçonne que vous avez créé votre fonction en tant qu'utilisateur normal puis fait un CREATE OR REPLACE FUNCTION... en tant qu'utilisateur postgres. Mais cette manip ne change pas le "owner", elle garde l'utilisateur initial et ne remplace que le corps de la fonction.

Faites plutôt un DROP FUNCTION et CREATE FUNCTION en tant que postgres.

Pied de page des forums

Propulsé par FluxBB