
рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдЦреЗрд▓ рд░реБрдЪрд┐ рд╕реЗ рдмрд╛рд╣рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ PostgreSQL 10 рдореЗрдВ pg_stat_activity рджреГрд╢реНрдп рдореЗрдВ wa_event_type рдФрд░ Wait_event рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЬреЛ рдХрд┐ v $ рд╕рддреНрд░ рд╕реЗ wa_class рдФрд░ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИрдВред
рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдордп
akardapolov рдХреЗ ASH- рджрд░реНрд╢рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо
рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ
рд╣реБрдП , рдореИрдВ рдЙрддреНрд╕реБрдХ рдерд╛ рдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬрд╝ рдХреЗ рддрд╣рдд рдЗрд╕ рдЙрддреНрдкрд╛рдж рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдХрд┐рддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореИрдВ рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдбреЗрд╡рд▓рдкрд░ рдирд╣реАрдВ рд╣реВрдВ, рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВрдиреЗ рднреА рдкрд╛рдпрд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрдЧ рд╣реИрдВ, рдЬреЛ рдУрд░реЗрдХрд▓ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдорд╛рдирдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рднреАред
PASH- рджрд░реНрд╢рдХ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд:
рдХреЛрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд pg_stat_activity рджреГрд╢реНрдп рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВред
рдПрдХ рдмрд╛рд░ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, рд╕рдХреНрд░рд┐рдп рд╕рддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
pg_stat_activity рдкрд╛рда рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВSELECT current_timestamp, datname, pid, usesysid, usename, application_name, backend_type, coalesce(client_hostname, client_addr::text, 'localhost') as client_hostname, wait_event_type, wait_event, query, query_start, 1000 * EXTRACT(EPOCH FROM (clock_timestamp()-query_start)) as duration from pg_stat_activity where state='active' and pid != pg_backend_pid();
рд╣рд░ 15 рд╕реЗрдХрдВрдб рдореЗрдВ рдПрдХ рдмрд╛рд░ рдЕрдВрддрд┐рдо 15 рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рдбреЗрдЯрд╛ рдФрд╕рдд рдФрд░ рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
рдПрд╕рдХреНрдпреВрдПрд▓ рдЖрдИрдбреА рдЬреЛ рд╢реАрд░реНрд╖ рдПрд╕рдХреНрдпреВрдПрд▓ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдореИрдВ рдЦреБрдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рдХрд╛ pg_stat_statements рд╕реЗ рдХреНрд╡реЗрд░реА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдХреНрд╡реЗрд░реА рдлрд╝реАрд▓реНрдб рдХреЛ pg_stat_activity рд╕реЗ рдЬреЛрдбрд╝рд╛ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
SQL id = md5 рд╕реЗ рдкрд╣рд▓рд╛ 13 рдЕрдХреНрд╖рд░ (рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреНрд╡реЗрд░реА рдЯреЗрдХреНрд╕реНрдЯ)ред
рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреНрд╡реЗрд░реА рдЯреЗрдХреНрд╕реНрдЯ рдПрдХ рдХреНрд╡реЗрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдиреНрдпреВрд▓рд╛рдЗрди рд╡рд░реНрдг рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдмреНрджрд┐рдХреЛрдВ рдХреЛ $ 1, $ 2, рдЖрджрд┐ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдХреНрд╡реЗрд░реА рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдореИрдВрдиреЗ рдПрдХ рдмреБрд░рд╛ рд▓рд┐рдЦрд╛ред рдореИрдВ рдкрд╛рда рдХреЛ рдЙрджреНрдзреГрдд рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЗрд╕реЗ рди рджреЗрдЦреЗрдВ, рдЕрдиреНрдпрдерд╛ рдореБрдЭреЗ рд╢рд░реНрдо рдЖрддреА рд╣реИред рдмреЗрд╣рддрд░ рд╣реИ рдПрдХ рдЕрдЪреНрдЫрд╛ рднреЗрдЬреЗрдВред
NormalizeSQL public static String NormalizeSQL(String sql) { sql = sql.replaceAll("\\n", " "); sql = sql.replaceAll("\\(", " ( "); sql = sql.replaceAll("\\)", " ) "); sql = sql.replaceAll(",", " , "); sql = sql.replaceAll("'", " ' "); sql = sql.replaceAll("=", " = "); sql = sql.replaceAll("<", " < "); sql = sql.replaceAll(">", " > "); sql = sql.replaceAll(";", ""); sql = sql.replaceAll("[ ]+", " "); sql = sql.replaceAll("> =", ">="); sql = sql.replaceAll("< =", "<="); sql = sql.toLowerCase().trim(); String[] array = sql.split(" ", -1); int var_number = 0; String normalized_sql = ""; Boolean quote_flag = false; for (int i = 0; i < array.length; i++) { if (array[i].equals("'")) { if (!quote_flag) { quote_flag = true; var_number++; normalized_sql += "$" + var_number + " "; } else { quote_flag = false; } } else if (quote_flag) { continue; } else if (array[i].matches("-?\\d+(\\.\\d+)?")) { var_number++; normalized_sql += "$" + var_number + " "; } else if (array[i].equals("order")) { for (int j = i; j < array.length; j++) { normalized_sql += array[j] + " "; } return normalized_sql.trim(); } else { normalized_sql += array[i] + " "; } } return normalized_sql.trim(); }
рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ред рдпрд╣ рдУрд░реЗрдХрд▓ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЖрдк рдЖрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ, "рдореБрдЭреЗ sqlid рдХреЗ рд▓рд┐рдП рдПрдХ рдпреЛрдЬрдирд╛ рджреЗрдВ = ...", рдФрд░ рд╡рд╣ рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ - "рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд╡реАрдирддрдо рдПрдХ рд╣реИ, рдпрд╛ рдХрд▓ рд╣реИ, рдпрд╛ рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рджрд┐рдЦрд╛рдПрдВ?" рдФрд░ PostgreSQL рдЖрдкрдХреЛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ - "sqlid рдХреНрдпрд╛ рд╣реИ?"ред
рдЗрд╕рд▓рд┐рдП, SELECT / UPDATE / INSERT / DELETE рдлреЙрд░реНрдо рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рднреЗрдЬреЗрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВред рд╣рдо рдЗрд╕реЗ рдкреНрд░рддрд┐ рдШрдВрдЯреЗ 1 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ EXPLAIN рдЙрд╕реА рддрд░рд╣ рд▓реЙрдХ рдкрд░ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдЕрдиреБрд░реЛрдз рд╕реНрд╡рдпрдВ рд▓рдЯрдХрд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдпреЛрдЬрдирд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ setQueryTimeout (1) рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ред
рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрдиреБрд░реЛрдз рдЙрд╕реА рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдиреЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдерд╛ (рдХрдиреЗрдХреНрд╢рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЖрдк рд╕реБрдкрд░рд╕реБрд╕рд░ (рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ) рдХреЗ рддрд╣рдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ, рдЬрд┐рд╕рд╕реЗ рдХреБрдЫ рд▓реЛрдЧ рдбрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
CREATE USER pgmonuser WITH password 'pgmonuser'; GRANT pg_monitor TO pgmonuser;
GitHub рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб
рдХрд░реЗрдВ :
https://github.com/dbacvetkov/PASH-Viewer/releasesрдпреБрдкреАрдбреА:рд╕рдВрд╕реНрдХрд░рдг 0.3 рдореЗрдВ, рдЗрд╕рдиреЗ PostgreSQL 9.6 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ (рдХреЗрд╡рд▓ рджреЛ рд╡реЗрдЯрд┐рдВрдЧ рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИрдВ - рд▓реЙрдХ рдФрд░ LWLock, рдмрд╛рдХреА рд╕рдм рдХреБрдЫ "CPU" рдХреА рддрд░рд╣ рд╣реИ) рдФрд░ PostgreSQL 9.4 - 9.5 (рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕реАрдкреАрдпреВ рдпрд╛ рд▓реЙрдХ рд╡реЗрдЯрд┐рдВрдЧ рд╣реИ)ред
рд╕рдВрд╕реНрдХрд░рдг 0.3.1 рдореЗрдВ, рд╢реАрд░реНрд╖ рд╕рддреНрд░реЛрдВ рдореЗрдВ рдмреИрдХреЗрдВрдб рдкреНрд░рдХрд╛рд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЪрд╛рд░реНрдЯ рдкрд░ рд╕рдлреЗрдж рдкрдЯреНрдЯрд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдпрд╛ред
рд╕рдВрд╕реНрдХрд░рдг 0.3.2 рдореЗрдВ, рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдХрд╛рдо, рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдХреБрдЫ рдЖрдВрдХрдбрд╝реЗ рдЬреЛрдбрд╝реЗ (AVG рдЕрд╡рдзрд┐, рдХреЙрд▓ рдХрд╛рдЙрдВрдЯ) рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдЗрдВрдЯрд░рдиреЗрдЯ рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛:
рдХреИрд╕реЗ-рдХреИрд╕реЗ-рдмрдирд╛рдПрдВ-pg_stat_activity- рдРрддрд┐рд╣рд╛рд╕рд┐рдХ-рддрд╛рд▓рд┐рдХрд╛ ред
рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдмрдзрд╛рдИ:
ASH- рджрд░реНрд╢рдХ рдХреЗ рд▓рд┐рдП рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХрд╛рд░реНрджрд╛рдкреЛрд▓реЛрд╡ред
рдкрд░рд╛рдорд░реНрд╢ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдВрдЯреЛрди рдЧреНрд▓реБрд╢рд╛рдХреЛрд╡ред
рджрд┐рдорд┐рддреНрд░реА рд░реБрджреЛрдкреЛрд╕реЗрд╡ рдиреЗ рдпрд╣ рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЧрд┐рдердм рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдзрд┐рдХ рд╕реНрд▓рд╛рдЗрдб:


