PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

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

#26 Re : Optimisation » Optimisation requête » 29/03/2019 17:01:54

Bonjour Julien,


Merci beaucoup pour vos éclairages et conseils smile

#27 Optimisation » Optimisation requête » 21/03/2019 17:45:07

coucou78187
Réponses : 3

Bonjour à tou(te)s,


je vous propose ce sujet si vous le permettez,

une requête de jointure simple :


select * from table1 t1 join table2 t2 on t1.c1 = t2.c2;



t1 = 760000 rows
t2 = 15000000 rows

c1 = integer avec btree index et unique constraint
c2 = integer avec btree index



maintenance_work_mem = 224MB
checkpoint_completion_target = 0.9
effective_cache_size = 2816MB
work_mem = 64MB
wal_buffers = 16MB
shared_buffers = 896MB
max_connections = 200



explain analyze buffer select * from table1 t1 join table2 t2 on t1.c1 = t2.c2:



Merge Join  (cost=13.07..695479.32 rows=15118257 width=2410) (actual time=0.022..8080.992 rows=15116864 loops=1)
   Merge Cond: (t1.t1_inst_id_ = t2.t1_inst_id_)
   Buffers: shared hit=97064 read=261175
   ->  Index Scan using table1_t1_inst_id__key on table1 t1  (cost=0.42..23766.66 rows=758949 width=1793) (actua
l time=0.010..176.442 rows=758997 loops=1)
         Buffers: shared hit=9558 read=12085
   ->  Index Scan using act_idx_hi_t1t2_t1_inst on table2 t2  (cost=0.43..481117.29 rows=15118257 width=617) (actual tim
e=0.006..3352.968 rows=15116864 loops=1)
         Buffers: shared hit=87506 read=249090
Planning Time: 0.360 ms
Execution Time: 8748.590 ms
(9 lignes)



OS: centos 7
pgsql : 9.3




je voulais vous demander quelles seraient les techniques d'optimisation pour celà svp.



en effet il n'y a pas de clause where pour discriminer un minimum...



l'explain indique un temps d'exécution de 9 secondes alors que la requete en prends plus de 100000 Milli-Secondes...



Merci beaucoup

#28 Re : Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 13/02/2019 16:50:46

Bonjour Guillaume, Daniel,


Merci beaucoup pour votre aide,


j'ai pu réaliser les tests dont j'avais besoin pour l'étude de cas.


Merci pour l'idée d'utiliser la fonction format()


A tester dans de vrai condition de production


j'essaierai de partager ces expériences et état d'avancement pour partager.


bonne semaine à vous smile

#29 Re : Général » Update de ligne avec champs de type jsonb » 11/02/2019 11:52:42

Bonjour Julien,


Merci pour le retour,


En effet, j'ai positionné d'autre colonnes (date de création --> timestamp, ID --> PK) pour ne pas tout mettre dans la colonne JSONB.


Ce qui se passe est que cette application sera utilisée par différents clients avec des besoins (codes différents) donc il fallait un modèle qui puisse être transposable à chacun sans avoir a redévelopper à chaque fois.



Peut être que cette démarche est contre productive...



Mais c'est vrai que mettre des colonnes fixes pour des codes communs aux différents clients serait à étudier.



smile

#30 Re : Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 11/02/2019 11:20:52

Bonjour Guillaume,



Merci pour le retour.

Je m'y suis peut être mal pris pour la syntaxe mais j'ai un message d'erreur :



update referencement set valeur = jsonb_set(jsonb_set("valeur", '{"code01"}', ('"'||uuid_generate_v4()||'"')), '{"code02"}', ('"'||uuid_generate_v4()||'"'))
where num_matricule = 'KJF000000000089745';
ERROR:  function jsonb_set(jsonb, unknown, text) does not exist
LIGNE 1 : update referencement set valeur = jsonb_set(jsonb_set(valeur,...
                                                                               ^


Comme si le moteur PostgreSQL n'aime pas l'enchainement      " (jsonb_set(jsonb_set  "
                                                                                                            ^


Merci,


Bonne semaine!

#31 Re : Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 07/02/2019 18:01:25

re Bonjour,

je rencontre maintenant une difficulté pour updater plusieurs codes par exemple:



pour modifier le code03 et le code02

pour le matricule KJF000000000089745 j'ai essayé:



update referencement set valeur = jsonb_set("valeur", '{"code03"}', ('"'||uuid_generate_v4()||'"'), '{"code02"}', ('"'||uuid_generate_v4()||'"'::jsonb))
where num_matricule = 'KJF000000000089745';



update referencement set valeur = jsonb_set("valeur", '{"code03"}', '{"code02"}', ('"'||uuid_generate_v4()||'"')::jsonb)
where num_matricule = 'KJF000000000089745';



ces syntaxes ne fonctionnent pas, je n'ai pas trouver de syntaxe équivalente sur le web.



pensez-vous que celà soit possible ?



j'essaient d'appréhender les opérateurs jsonb mis a disposition tongue



Merci beaucoup!

#32 Re : Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 07/02/2019 15:45:46

Merci Guillaume,


c'est bien passé!  smile



-[ RECORD 1 ]------------------------------------
num_matricule                  | KJF000000000089745
created_at                        | 2019-02-05 16:15:33.987273+01
code03                             | 4de8f36d-dc0a-4916-8e1d-e7d154b6afbc

Temps : 0,580 ms




je vais maintenant continuer les tests de perfs pour modifier plusieurs codes pour plusieurs matricules


Merci

#33 Re : Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 07/02/2019 14:58:13

Bonjour Guillaume,

C'est vrai, ce sera mieux  smile  :

ont été testés:


update referencement set valeur = jsonb_set("valeur", '{"code03"}', '"|| uuid_generate_v4() ||"'::jsonb)
where num_matricule = 'KJF000000000089745';
UPDATE 1
Temps : 2,254 ms



update referencement set valeur = jsonb_set("valeur", '{"code03"}', '" uuid_generate_v4() "'::jsonb)
where num_matricule = 'KJF000000000089745';
UPDATE 1
Temps : 1,683 ms


En réalité, les deux passent bien, seulement elle insèrent les valeurs respectives siuvantes :    || uuid_generate_v4() ||    et     uuid_generate_v4()  pour le code03 alors que je voudrais si possible UPDATER par une valeur de type "uuid" en utilisant la fonction.


Merci!

#34 Général » utiliser la fonction uuid_generate_v4() dans un update de champs jsonb » 07/02/2019 11:24:34

coucou78187
Réponses : 10

Bonjour à tous,

je continue mes tests utilisant postgresql/json ce qui est fort intéresant.

j'ai réussi a avoir un jeu de données avec 500000 lignes avec des "num_matricule (PK)" différents

dans la colonne "valeur JSONB" j'ai inséré pour chaque "num_matricule" 50 codes de type (uuid) comme suit :


do
$$
declare
  i record;
begin
  for i in 1..500000 loop
INSERT INTO referencement (valeur) VALUES (( '{ "code01": "' || uuid_generate_v4() || '",
"code02": "' || uuid_generate_v4() || '",
"code03": "' || uuid_generate_v4() || '",
...
"code50": "' || uuid_generate_v4() || '"}')::jsonb);
  end loop;
end;
$$
;



Ce qui me permet d'avoir une bonne base de données à manipuler pour faire différents tests de performances (CRUD) avec des données aléatoires pour chaque code.

Lorsque je séléctionne (SELECT) différents codes pour un matricule avec la requête suivante :

select num_matricule,
r.valeur->>'code01'     as code01,
r.valeur->>'code02' as code02,
r.valeur->>'code03' as code03
from referencement u
where r.num_matricule = 'KJF000000000089745';

j'obtiens:

-[ RECORD 1 ]------------------------------------
num_matricule         | KJF000000000089745
code01    | 8314d49b-8ad4-4890-9d20-231a53cc3c17
code02    | 655a3e1d-841c-4453-a758-9705b72bfc86
code03    | bfe2a417-f006-4e33-955d-bbb3066cf220
Temps : 0,529 ms ==>  Je trouve celà assez rapide sachant que la PK est utilisée dans ce cas et que j'ai positionné un index GIN sur la colonne "valeur"


Lorsque je voulais tester les update de code pour un num_matricule donné, j'y arrive comme suit avec jsonb_set :

UPDATE referencement SET valeur = jsonb_set(valeur, '{code03}','"bfesdf7-f006-4e33-855d-bhe8766cf225"', true)
where  num_matricule = 'KJF000000000089745';
Temps : 2,023 ms ==> je trouve ça rapide même si je n'ai pas de base de comparaison sachant que la PK est utilisée.



ET C'EST LA QUE LES PROBLEMES ARRIVENT smile   :

je désirerai modifier un code pour un num_matricule en utilisant la fonction uuid_generate_v4()
je n'y arrive pas dans ma syntaxe pour que la fonction soit prise en compte et ça prend textuellement 'uuid_generate_v4()' pour un code donnée.



Voilà mes questions :

- Comment faire au niveau de la syntaxe pour que la fonction soit prise en compte et utilisée
- Comment pourrait-on faire pour modifier plusieurs code (environ 15)  pour plusieurs num_matricule (1000) pour tester les performances



juste pour info complémentaire :



maintenance_work_mem =1024MB
checkpoint_completion_target = 0.9
effective_cache_size = 2816MB
work_mem = 512MB
wal_buffers = 64MB
shared_buffers = 2048MB
max_connections = 200

RAM: 4G
CPU: 2

Merci à vous et j'espère que ce post pourrait servir à d'autres wink

#35 Re : Général » Update de ligne avec champs de type jsonb » 04/02/2019 17:14:07

Bonjour rjuju,


Merci pour la réponse et la syntaxe de mise à jour qui a fonctionné pour une ligne smile

En fait pour être plus précis, il sera stocké des codes (entre 30 et 50 par matricule et de tailles variables)  très aléatoires (IP, MAC et autres différents) donc pas trop de contraintes fortes.

Concernant le varchar pour la colonne faisant office de PK, je l'ai utilisé car le modèle est le suivant AAAAAANNNNNNNNNNNN où "A" = caractère alphabétique (A-Z) et N = caractère numérique (0-9), peut-être est-ce une mauvaise idée ?...

C'est surtout le fait d'avoir des codes très nombreux par matricule qui m'ont fait pensé au stockage JSON pour ne pas avoir des colonnes très nombreuses  et se retrouver face à une table dite "obèse".

Comme il s'agit d'une phase de test de perf, c'est pour cela que je posais la question de savoir s'il existait un moyen de peupler en masse un champs jsonb avec des documents json aléatoires selon des valeurs (generate_series par exemple) pour pouvoir réaliser des tests sur postgreSQL pour voir si les performances étaient assurées

J'espère que ces infos apportent des indications utiles

Merci beaucoup rjuju!

#36 Général » Update de ligne avec champs de type jsonb » 01/02/2019 18:13:14

coucou78187
Réponses : 4

Bonjour à toutes et à tous,

je me penche actuellement sur le stockage au format JSON dont voici la table appellée referencement :

il s'agit de la version 11.1 de PostgreSQL

CHAMPS                          TYPE                                                 
num_matricule              varchar(18)                      not null 
valeur                          jsonb                                               
timestamp                    timestamp with time zone                               default_value:now()

PK: num_matricule


Je cherche à stocker un grand nombre de valeur (nom, poids, couleurs des cheveux, couleurs des yeux, age, nationalité, habitude alimentaire (vegan)...)
en gros à peu près 50 paramètres qui peuvent varier d'un individu à l'autre.

En tout et à terme, il y aurait environ 100 millions de lignes (num_matricule) avec son format json respectifs contenant toutes les caractéristiques.
Aussi, comme je trouve l'idée de mettre 50 colonnes sur une table (obèse) pas très correcte et que les caractéristiques sont très hétérogènes pour créer des tables relationnelles (PK, FK),
je me tourne vers le JSON, d'ailleurs j'aimerais si possible vous poser le question pour savoir si c'est une bonne idée de vouloir procéder ainsi?

déroulement des étapes:

- création de la table
- injection de 100 millions de lignes dans la colonnes num_matricule (1,2,3,4,5,6,7,8,9,..10000000) respectant le format varchar(18)

et là l'étape bloquante lorsque j'essaie d'UPDATER une ligne en lui ajoutant un document json comme suit avec jsonb_set :

UPDATE referencement
SET valeur = jsonb_set(valeur, '{nationalité}',  '"française"', TRUE)
WHERE num_matricule = '154698754522365412';
UPDATE

on dirait qu'il n'y a pas d'erreur de syntaxe mais lorsque je fait :

select * from referencement where num_matricule = '154698754522365412';  ==> aucune donnée dans la colonne "valeur"

Je me permets de vous solliciter pour connaitre le moyen d'updater une ligne en lui ajoutant un document json dans son champs jsonb sachant que la colonne jsonb était vide avant.

Je ne sais pas si je suis assez claire.

Aussi je voulais savoir s'il existait un moyen de peupler en masse un champs jsonb avec des document json aléatoires selon des valeurs?

je récapitule les points :

- j'aimerais si possible vous poser le question pour savoir si c'est une bonne idée de vouloir procéder ainsi?
- le moyen d'updater une ligne en lui ajoutant un document json dans son champs jsonb sachant que la colonne jsonb était vide avant?
- je voulais savoir s'il existait un moyen de peupler en masse un champs jsonb avec des document json aléatoires selon des valeurs?


Merci beaucoup pour votre aide et échanges

Cordialement,

Pied de page des forums

Propulsé par FluxBB