En complément de l'article
Tentative de création d'un analogue d'ASH pour PostgreSQL .
Défi
Vous devez lier l'historique des vues pg_stat_statemenets, pg_stat_activity. Par consĂ©quent, en utilisant l'historique des plans d'exĂ©cution de la table de service log_query, vous pouvez obtenir de nombreuses informations utiles Ă utiliser pour rĂ©soudre les incidents de performances et optimiser les requĂȘtes.
Avertissement
En raison de la nouveauté du sujet et de la période de test incomplÚte, l'article peut contenir des erreurs. La critique et les commentaires sont fortement encouragés et attendus.
Entrer les données
Table History_pg_stat_activity Table Pg_stat_db_queries CREATE TABLE pg_stat_db_queries ( database_id integer , queryid bigint , query text , max_time double precision );(
Vue matérialisée de mvw_pg_stat_queries CREATE MATERIALIZED VIEW public.mvw_pg_stat_queries AS SELECT t.queryid, t.max_time, t.query FROM public.dblink('LINK1'::text, 'SELECT queryid , max_time , query FROM pg_stat_statements WHERE dbid=(SELECT oid FROM pg_database WHERE datname=current_database() ) AND max_time >= 0 '::text) t(queryid bigint, max_time double precision, query text) WITH NO DATA;
Table log_query CREATE TABLE log_query ( id integer , queryid bigint , query_md5hash text , database_id integer , timepoint timestamp without time zone , query text , explained_plan text[] , plan_md5hash text , explained_plan_wo_costs text[] , plan_hash_value text , ip text, port text , pid integer );
Algorithme général
Actualiser la table pg_stat_db_queries
Actualiser la vue des matériaux mvw_pg_stat_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_queries_list( database_id int) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; BEGIN SELECT * INTO database_rec FROM endpoint e JOIN database d ON e.id = d.endpoint_id WHERE d.id = database_id ; IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_id; return TRUE ; END IF ; EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||database_rec.host||' port=5432 dbname='||database_rec.name|| ' user='||database_rec.s_name||' password='||database_rec.s_pass|| ' '')'; REFRESH MATERIALIZED VIEW mvw_pg_stat_queries ; PERFORM dblink_disconnect('LINK1'); RETURN result; END $$ LANGUAGE plpgsql;
Remplissez la table pg_stat_db_queries CREATE OR REPLACE FUNCTION refresh_pg_stat_db_queries( ) RETURNS BOOLEAN AS $$ DECLARE result BOOLEAN ; database_rec record ; pg_stat_rec record ; BEGIN TRUNCATE pg_stat_db_queries; FOR database_rec IN SELECT * FROM database d LOOP IF NOT database_rec.is_need_monitoring THEN RAISE NOTICE 'NO NEED MONITORING FOR database_id=%',database_rec.id; CONTINUE ; END IF ; PERFORM refresh_pg_stat_queries_list( database_rec.id ) ; FOR pg_stat_rec IN SELECT * FROM mvw_pg_stat_queries LOOP INSERT INTO pg_stat_db_queries ( database_id , queryid , query , max_time ) VALUES ( database_rec.id , pg_stat_rec.queryid , pg_stat_rec.query , pg_stat_rec.max_time); END LOOP; END LOOP; RETURN TRUE; END $$ LANGUAGE plpgsql;
Par consĂ©quent, la table contient des textes de requĂȘte normalisĂ©s, queryid, le temps d'exĂ©cution maximal de la requĂȘte au moment actuel (utilisĂ© pour la surveillance).
Remplir log_query et former un historique des plans d'exécution.
Le texte de la demande réelle est extrait du fichier journal. Fichier journal de l'hÎte cible vers l'hÎte de surveillance en plusieurs parties, script bash, cron. Pour économiser de l'espace et en raison de la trivialité de la tùche de copier un morceau d'un fichier texte d'hÎte en hÎte, le script n'est pas fourni.
Analyser un fichier journal et extraire le texte de la requĂȘte Remplissage de la table Log_query Par consĂ©quent, le tableau contient le texte de la demande rĂ©elle, les plans d'exĂ©cution, la valeur de hachage du plan d'exĂ©cution, la valeur de hachage du texte de la demande.
Remplissez la valeur queryid dans la table history_pg_stat_activity
update_history_pg_stat_activity_by_queryid.sql Par consĂ©quent, la table contient la valeur queryid correspondant Ă la valeur queryid de la requĂȘte.
Résumé
En liant pg_stat_activity, pg_stat_statements, log_query, vous pouvez obtenir de nombreuses informations utiles sur la demande, en particulier:
- Historique des plans de mise en Ćuvre.
- Historique de la demande de temps CPU.
- Demander l'historique des attentes.
Les données et de nombreux rapports supplémentaires seront décrits dans le prochain article.
Développement
En liant les informations disponibles à l'historique de la vue pg_locks, vous pouvez obtenir des informations sur les verrous spécifiques que la demande attendait et, plus important encore, sur le processus (demande) qui détenait ce verrou.
La solution à ce problÚme sera décrite dans le prochain article. Des tests et des améliorations sont en cours.