2

J'ai un lot de requêtes de test SQL que je voudrais exécuter et calculer leur calendrier. Je ne pas voulez obtenir le plan d'exécution avec la commande EXECUTE ANALYZE.Comment référencer un ensemble de requêtes PostgreSQL?

Sur la base de l'approche proposée ici Get execution time of PostgreSQL query J'ai écrit une procédure qui contient pour chaque requête le code suivant

------------------------- 
Query = 'Q1'; 
StartTime := clock_timestamp(); 

PERFORM <** Query 1 goes here **> 

EndTime := clock_timestamp(); 
Duration := 1000 * (extract(epoch from EndTime) - extract(epoch from StartTime)); 
INSERT INTO execution_tests VALUES (Query, StartTime, EndTime, Duration); 
------------------------- 

J'utilise EFFECTUER au lieu de SELECT pour exécuter la requête et jeter le résultat.

Cela fonctionne pour les requêtes simples, mais j'ai beaucoup de requêtes qui ont une clause WITH. Selon le manuel

Pour les requêtes WITH, utilisez PERFORM et placez la requête entre parenthèses. (Dans ce cas, la requête ne peut retourner une ligne.)

Cependant, toutes les requêtes WITH j'ai besoin de revenir de référence sur plusieurs lignes.

Comment résoudre ce problème?

Répondre

1

Qu'en est-il quelque chose comme

do $$ 
declare 
    p json; 
    your_query text := 'select pg_sleep(1.1)'; 
    t interval; 
begin 
    execute 'explain (analyse, format json) ' || your_query into p; 
    raise info '%', p; 
    t := make_interval(secs := ((p->0->>'Planning Time')::float + (p->0->>'Execution Time')::float)/1000); 
    raise info '%', t; 
end $$; 
+0

Great! Merci ! Comment supprimer les messages CONTEXT après RAISE INFO? J'ai essayé ALTER DATABASE test3 SET log_error_verbosity = TERSE; mais n'a pas fonctionné. P.S. J'exécute sur pgAdmin –

+0

@EstebanZimanyi Je ne sais pas ce que vous voulez dire. C'est juste un exemple. Comme je l'ai compris, vous voulez stocker le temps d'exécution dans la table ... – Abelisto

+0

En effet, mais il serait également agréable (pas nécessairement dans cet exemple particulier) de supprimer tous les messages tels que "CONTEXTE: PL/pgSQL fonction test_queries() ligne 262 à RAISE "chaque fois qu'un message est affiché sur l'écran lors de l'exécution de scripts longs, comme l'analyse comparative d'un lot de requêtes avec des facteurs d'échelle différents. Y-a-t-il un moyen de faire ça ? –