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).

#1 Re : Optimisation » Limit et performance dégradé » 02/05/2023 15:25:09

Bonjour,
Ok merci pour votre retour, je vais dupliquer l'instance et faire un upgrade pour voir ce que ça donne.

#2 Re : Optimisation » Limit et performance dégradé » 25/04/2023 16:27:58

J'ai essayé de passe par un CTE et de mettre le limit puis le order by + limit en dehors ça n'a rien changé.

#4 Optimisation » Limit et performance dégradé » 25/04/2023 16:17:43

Juju
Réponses : 4

Bonjour à tous,

Version : PostgreSQL 12.4 sur CentOS Linux release 7.7.1908.

J'ai un problème sur une requête, sans limit elle s'exécute très rapidement, si j'ajoute un limit les perfs sont totalement dégradés (et le plan d'exécution n'est plus du tout le même).
J'ai lancé un analyze sur les tables concernés (en essayant d'augmenter le statistics sur certaines colonnes), j'ai essayé pas mal de chose et je ne sais pas trop quoi faire de plus.
Est-ce que vous auriez une idée ?

Chaque table a une PK sur l'ID (Ex : pk_SF).
Chaque table à une FK vers la table qui suit dans les join, donc SF a une FK vers FI, FI vers FA, et FA vers US. La colonne Id_Cu est indexée (fk_US_ID_CU).

J'ai collé le plan d'exécution ici pour une meilleure visibilité : https://explain.dalibo.com/
Je ne sais pas comment le formater dans ce message, je vais regarder.


explain(analyze,buffers) select SF.ID
from SF
inner join FI on SF.ID_FI=FI.ID
inner join FA on FI.ID_FA=FA.ID
inner join US on FA.ID_US=US.ID
where  US.ID_Cu=3589
order by SF.ID asc limit 500;


Limit  (cost=1001.72..7982.26 rows=500 width=8) (actual time=11286.838..11367.893 rows=500 loops=1)
   Buffers: shared hit=50681527 read=300668
   ->  Gather Merge  (cost=1001.72..4725621.47 rows=338414 width=8) (actual time=11286.837..11367.852 rows=500 loops=1)
         Workers Planned: 2
         Workers Launched: 2
         Buffers: shared hit=50681527 read=300668
         ->  Nested Loop  (cost=1.70..4685560.07 rows=141006 width=8) (actual time=11281.667..11284.336 rows=376 loops=3)
               Buffers: shared hit=50681527 read=300668
               ->  Nested Loop  (cost=1.28..3662972.00 rows=2101335 width=8) (actual time=0.128..8512.638 rows=1317068 loops=3)
                     Buffers: shared hit=34876711 read=300666
                     ->  Nested Loop  (cost=0.86..2726320.62 rows=2101335 width=8) (actual time=0.095..5764.520 rows=1317068 loops=3)
                           Buffers: shared hit=19071965 read=300594
                           ->  Parallel Index Scan using pk_SF on SF  (cost=0.43..1446549.99 rows=2101335 width=8) (actual time=0.049..2213.763 rows=1317068 loops=3)
                                 Buffers: shared hit=3296007 read=271734
                           ->  Index Scan using pk_FI on FI  (cost=0.43..0.61 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=3951204)
                                 Index Cond: (FI.ID = SF.ID_FI)
                                 Buffers: shared hit=15775958 read=28860
                     ->  Index Scan using pk_FA on FA  (cost=0.42..0.45 rows=1 width=8) (actual time=0.002..0.002 rows=1 loops=3951204)
                           Index Cond: (FA.ID = FI.ID_FA)
                           Buffers: shared hit=15804746 read=72
               ->  Index Scan using pk_US on US  (cost=0.42..0.49 rows=1 width=4) (actual time=0.002..0.002 rows=0 loops=3951204)
                     Index Cond: (US.ID = FA.ID_US)
                     Filter: (ID_Cu = 3589)
                     Rows Removed by Filter: 1
                     Buffers: shared hit=15804816 read=2
Planning Time: 0.948 ms
Execution Time: 11367.991 ms


explain(analyze,buffers) select SF.ID
from SF
inner join FI on SF.ID_FI=FI.ID
inner join FA on FI.ID_FA=FA.ID
inner join US on FA.ID_US=US.ID
where  US.ID_Cu=3589
order by SF.ID asc;


Gather Merge  (cost=221551.06..244443.77 rows=199067 width=8) (actual time=242.353..261.827 rows=64225 loops=1)
   Workers Planned: 1
   Workers Launched: 1
   Buffers: shared hit=320499 read=10667
   ->  Sort  (cost=220551.05..221048.72 rows=199067 width=8) (actual time=237.831..239.886 rows=32112 loops=2)
         Sort Key: SF.ID
         Sort Method: quicksort  Memory: 3484kB
         Worker 0:  Sort Method: quicksort  Memory: 1831kB
         Buffers: shared hit=320499 read=10667
         ->  Nested Loop  (cost=3018.77..203030.28 rows=199067 width=8) (actual time=2.695..227.630 rows=32112 loops=2)
               Buffers: shared hit=320492 read=10667
               ->  Nested Loop  (cost=3018.34..64734.51 rows=80414 width=4) (actual time=2.626..105.165 rows=32176 loops=2)
                     Buffers: shared hit=68890 read=4990
                     ->  Parallel Hash Join  (cost=3017.91..7059.10 rows=10456 width=4) (actual time=2.573..31.903 rows=4622 loops=2)
                           Hash Cond: (FA.ID_US = US.ID)
                           Buffers: shared hit=3297 read=28
                           ->  Parallel Seq Scan on FA  (cost=0.00..3632.16 rows=155816 width=8) (actual time=0.008..10.456 rows=132444 loops=2)
                                 Buffers: shared hit=2046 read=28
                           ->  Parallel Hash  (cost=2958.81..2958.81 rows=4728 width=4) (actual time=2.256..2.257 rows=3905 loops=2)
                                 Buckets: 8192  Batches: 1  Memory Usage: 384kB
                                 Buffers: shared hit=1207
                                 ->  Parallel Bitmap Heap Scan on US  (cost=170.71..2958.81 rows=4728 width=4) (actual time=0.857..3.411 rows=7810 loops=1)
                                       Recheck Cond: (ID_Cu = 3589)
                                       Heap Blocks: exact=1171
                                       Buffers: shared hit=1207
                                       ->  Bitmap Index Scan on fk_US_ID_CU  (cost=0.00..168.70 rows=8038 width=0) (actual time=0.635..0.636 rows=7810 loops=1)
                                             Index Cond: (ID_Cu = 3589)
                                             Buffers: shared hit=36
                     ->  Index Scan using fk_FI_FA on FI  (cost=0.43..4.80 rows=72 width=8) (actual time=0.004..0.015 rows=7 loops=9244)
                           Index Cond: (FA.ID = FI.ID_FA)
                           Buffers: shared hit=65593 read=4962
               ->  Index Scan using fk_SF_FI on SF  (cost=0.43..1.67 rows=5 width=8) (actual time=0.003..0.003 rows=1 loops=64351)
                     Index Cond: (SF.ID_FI = FI.ID)
                     Buffers: shared hit=251602 read=5677
Planning Time: 0.764 ms
Execution Time: 265.550 ms

#5 Re : Général » Comparaison taille table/colonne INTEGER ET VARCHAR » 29/06/2020 07:55:57

Bonjour,
Vous pouvez oublier mon dernier message, je me suis embrouillé en calculant par rapport au %age/ratio. Les entêtes expliquent complètement les tailles que j'obtiens et les diffférences entre INT et VARCHAR.
Merci pour votre réponse !
Julien.

#6 Re : Général » Comparaison taille table/colonne INTEGER ET VARCHAR » 26/06/2020 12:58:59

Merci pour votre réponse !
Je vais re-regarder en détail le lien vers la doc, ça ne fera pas de mal de revoir tout ça smile
Par contre par rapport à ces "frais fixes", en sachant qu'ils sont censés être les mêmes pour les 2 tables, je ne m'explique toujours pas pourquoi la table avec un varchar(22) prend 50% environ de place en plus alors que l'espace pour un varchar(22) est 6 fois plus important que pour un int ?
Julien.

#7 Général » Comparaison taille table/colonne INTEGER ET VARCHAR » 26/06/2020 10:27:36

Juju
Réponses : 3

Bonjour à tous,

Je suis sur Postgres v11.6 sous CentOS. Je créé ce sujet parce que je n'arrive pas à trouver l'explication sur la différence entre les tailles de 2 tables. Voici le test :

create table t_i(id integer);
insert into t_i select generate_series(1,500000);

create table t_v(id varchar(22));
with cpt as (select generate_series(0,500000) as i) insert into t_v select UUIDToBase62(replace(uuid_generate_v4()::varchar,'-','')) from cpt;

select count(*) from t_i; -- 500000
select count(*) from t_v; -- 500000

select pg_size_pretty(pg_relation_size('t_i')); -- 17 MB
select pg_size_pretty(pg_relation_size('t_v')); -- 25 MB

select pg_size_pretty(pg_total_relation_size('t_i')); -- 17 MB
select pg_size_pretty(pg_total_relation_size('t_v')); -- 25 MB

select pg_size_pretty(sum(pg_column_size(id))) from t_i; -- 1953 kB
select pg_size_pretty(sum(pg_column_size(id))) from t_v; -- 11 MB

Je m'attendais à ce qu'il y ait une différence plus importante sur la taille des tables, qui serait cohérent avec la différence de taille entre les 2 colonnes id integer et varchar (facteur 6, alors que sur la table on a 50% en plus environ).
Pour info dans la colonne varchar la taille oscille entre 19 et 22 caractères.

Merci !
Julien.

#8 Re : Général » Appel en boucle d'une procédure stockée » 31/01/2020 16:18:16

Bonjour,
Merci pour votre retour, je vais effectivement partir sur une solution hors DB, à priori plutôt un script python.
Merci.
Julien.

#9 Général » Appel en boucle d'une procédure stockée » 29/01/2020 16:24:22

Juju
Réponses : 2

Bonjour à tous,

OS : CentOS 7.6.1810
Postgres v11.5

Je souhaiterais faire un truc tout bête : appeler une procédure stockée toutes les 50 ou 100 ms. J'ai regardé du côté de cron ou pg_cron mais le minimum est de 1 minute.

J'ai testé une solution un peu rapide/bourrin : j'ai créé une 2ème procédure stockée, que je lance en arrière plan avec psql, qui boucle à l'infini, appelle la 1ère procédure puis fait un pg_sleep, et donc tout ça à l'infini, mais au bout d'un moment j'ai un out of memory (je n'ai pas encore creusé pourquoi).
Quelle solution serait la plus simple à mettre en place et aussi facile à monitorer (pour lever une alerte en cas de plantage) ?

Merci pour vos suggestions.
Julien.

#10 Re : PL/pgSQL » Liste des géométries des tables d'un schema - PG 9.6 » 27/01/2020 13:32:26

Bonjour,
Je ne sais pas si c'est ce que vous cherchez, mais avec PostGIS vous avez une vue : geometry_columns (qui par défaut se trouve dans le schéma public) et qui contient toutes les colonnes geometries.
Julien.

#11 Re : PL/pgSQL » Trigger d'audit : déterminer les colonnes qui ont été modifiées » 06/01/2020 11:27:50

Bonjour,
Merci pour votre réponse, je ne connaissais pas le IS DISTINCT FROM (qui rend l'écriture de la condition moins lourde !!).
Je vais regarder du côté de ces extensions, j'avais entendu parler de E-maj mais pas de l'autre, je dois formater les données d'une façon bien précise donc je ne sais pas si ça répondra à mon besoin.
Merci et bonne journée.
Julien.

#12 PL/pgSQL » Trigger d'audit : déterminer les colonnes qui ont été modifiées » 03/01/2020 19:01:42

Juju
Réponses : 2

Bonjour à tous,

Petite prise de tête du vendredi smile
Je suis en Postgres v11.5 sous CentOS.

Je veux écrire un trigger qui lors d'un update sur une table stockerait dans une autre table (dans un jsonb) seulement les valeurs réellement modifiées.
J'ai pour cela créé un trigger (for each statement) et ma fonction trigger. J'essaye de trouver la méthode la moins lourde à mettre en place (sachant que potentiellement je vais devoir faire cet audit sur pas mal d'autres tables). Pour l'instant, à part comparer les colonnes 1 à 1 entre anciennes et nouvelles lignes je ne vois rien de plus rapide à écrire. L'idéal serait une façon plus générique ou dynamique de faire ça mais je bloque un peu là. Si quelqu'un a une idée je suis preneur ! Pour info la table contient des colonnes de tous types (integer, varchar, date, double , geometry). Pour les colonnes nullable je pourrais utiliser COALESCE mais le problème c'est que je ne maitrise pas forcément ce qui peut être rentrée dans certaines colonnes donc ça me semblait plus sûr avec cette méthode.

CREATE OR REPLACE FUNCTION MySchema.MyFunction() RETURNS TRIGGER AS $BODY$
DECLARE
	oldRow RECORD;
	newRow RECORD;
BEGIN
	
	-- For each row, we will compare each attribute and store in the event only ones that have changed
	FOR oldRow IN SELECT * FROM old_rows
	LOOP
		SELECT * INTO newRow FROM new_rows WHERE id = oldRow.id;
		
		-- For not null columns
		IF oldRow.col1 <> newRow.col1 THEN
			raise notice 'col1 changed';
		END IF;
		
		-- For null columns
		IF oldRow.col2 <> newRow.col2
			OR oldRow.col2 is null and newRow.col2 is not null
			OR oldRow.col2 is not null and newRow.col2 is null THEN
			raise notice 'col2 changed';
		END IF;
		
		-- Etc...
	
	END LOOP;
	
	RETURN NULL;
END;
$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER MyTrigger
    AFTER UPDATE ON MyTable
    REFERENCING OLD TABLE AS old_rows NEW TABLE AS new_rows
    FOR EACH STATEMENT EXECUTE FUNCTION MySchema.MyFunction();

Merci d'avance !
Julien.

#13 Re : Général » Sauvegarde à chaud - Question » 19/03/2018 22:15:08

Bonjour,
Merci pour votre réponse c'est plus clair. Effectivement sans les WAL générés pendant le backup la copie ne servira pas à grand chose smile
Encore merci.
Julien.

#14 Re : Général » Current querry postgres 8.4 » 19/03/2018 17:30:51

Dans ce cas il ne doit y avoir aucune requête en cours, d'où le <IDLE> dans current_query.
NB : je viens de voir que depuis la 9.2 la colonne current_query a été remplacée par 2 colonnes (state et query), ce qui fait que même pour une session IDLE on peut avoir sa dernière requête dans query, alors que dans votre cas on a juste <IDLE>.
Julien.

#15 Re : Général » Current querry postgres 8.4 » 19/03/2018 17:02:39

Bonjour,
Je dirais que votre user n'est pas superuser à priori. D'après la doc : "The columns that report data on the current query are available unless the parameter track_activities has been turned off. Furthermore, these columns are only visible if the user examining the view is a superuser or the same as the user owning the process being reported on".
Julien.

#16 Général » Sauvegarde à chaud - Question » 19/03/2018 16:58:05

Juju
Réponses : 2

Bonjour,

J'ai une question concernant la sauvegarde à chaud avec Postgres (v9.5 et plus). Une fois que la commande pg_start_backup() a été exécutée, on peut copier tous les fichiers de l'instance nécessaires à une restauration. Sachant que pendant la sauvegarde les écritures se font toujours dans la répertoire data, comment Postgres fait-il pour que les fichiers copiés soient utilisables alors que potentiellement ils peuvent être modifiés pendant la copie ? J'ai lu que pg_start_backup force des "full page writes" (activé par défaut) jusqu'à l'exécution de pg_stop_backup(), c'est grâce à cela que lors de la restauration il peut remettre les fichiers (notamment ceux des tables par exemple) comme il faut ? En réécrivant en entier les blocks à restaurer ?

Merci.
Coridalement.

#17 Re : Migration » De Oracle à PG : trigger d'archivage » 08/11/2016 11:23:04

Bonjour,

Effectivement je n'avais pas vu cette option dans la doc, ça marche parfaitement avec. Merci beaucoup !

#18 Migration » De Oracle à PG : trigger d'archivage » 07/11/2016 17:27:17

Juju
Réponses : 2

Bonjour à tous,


Je suis en train de faire une migration Oracle (11gr2) vers PostgreSQL (9.5.4) et j'ai commencé à réécrire un certain nombre de trigger en PL/pgSQL, et je rencontre un problème avec un trigger en particulier.


Supposons que j'ai un schéma A avec une table T1, et un schéma B avec une table T2 ayant la même structure que T1. T2 est une table qui va contenir les lignes supprimées de T1. J'ai donc un trigger after delete sur T1 qui fait juste un insert select OLD.* dans T2.


Le user qui exécute le delete dans T1 a uniquement des droits sur T1, et pas sur T2. Ça marchait comme ceci sous Oracle, et sous PG je suis obligé de donner au user des droits en écriture sur T2 pour que le trigger s'exécute. Y-a-t-il moyen d'empêcher ça ? Parce que je ne veux pas que le user puisse écrire directement dans T2.


Merci.
Juju.

#19 Re : Migration » Ora2pg : foreign keys entre schémas » 01/08/2016 10:04:34

Bonjour,
Je viens de tester sur une base contenant 2 schemas et quelques tables et je confirme que tout est bon maintenant, j'ai bien les ordres de création des 2 schemas ainsi que toutes les FK entre mes schemas.
Merci encore !
Julien.

#20 Re : Migration » Ora2pg : foreign keys entre schémas » 29/07/2016 17:50:21

Bonjour,
Quelle réactivité !! Merci beaucoup pour ces corrections, je teste tout ça au plus vite et viendrai mettre à jour ce thread.
Merci encore.
Cordialement.

#21 Re : Migration » Ora2pg : foreign keys entre schémas » 29/07/2016 11:51:58

Bonjour,
J'ai fait quelques tests et pour l'instant ce n'est pas concluant. J'ai bien positionné EXPORT_SCHEMA à 1, j'ai enlevé l'option -n, je n'ai pas activé le paramètre SCHEMA dans le .conf, et en sortie j'ai un script contenant toutes les tables de tous mes schémas mais je n'ai plus les ordre de création des schémas (je n'ai pas touché au paramètre CREATE_SCHEMA qui par défaut est activé) et je n'ai toujours pas les foreign keys entre schémas. Je vais continuer à faire des tests (mais avec moins de schémas, parce que du coup l'extraction du DDL par ora2pg met 2h dans cette configuration).

#22 Re : Migration » Ora2pg : foreign keys entre schémas » 26/07/2016 18:11:30

Bonjour,
Effectivement j'exporte les schémas un par un, et c'est en lisant votre réponse que je me rends compte que c'est logique que les foreign keys vers d'autres schémas ne soient pas prises en compte... Je vais tester de les exporter tous à la fois.
Merci beaucoup !
Cordialement.

#23 Migration » Ora2pg : foreign keys entre schémas » 26/07/2016 09:53:23

Juju
Réponses : 6

Bonjour à tous,

Je suis en train de faire des tests de migration avec ora2pg v17.4 (depuis 1 base Oracle 11gR2). J'ai dans ma base 1 dizaine de schémas avec des foreign keys entre eux. Je vois que ora2pg ne prend pas ces foreign keys et pour l'instant je n'ai rien trouvé sur la doc ou le net par rapport à ça, savez-vous si une option le permet ?

Merci !

Pied de page des forums

Propulsé par FluxBB