Tigor

dbmon_stat_calculation

Jul 5th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. with s AS (SELECT
  2. CASE WHEN sum(total_time) = 0 THEN 1 ELSE sum(total_time) END AS sum_time,
  3. CASE WHEN sum(blk_read_time+blk_write_time) = 0 THEN 1 ELSE sum(blk_read_time+blk_write_time) END as sum_iotime,
  4. CASE WHEN sum(total_time-blk_read_time-blk_write_time) = 0 THEN 1 ELSE sum(total_time-blk_read_time-blk_write_time)
  5. END as sum_cputime,
  6. CASE WHEN sum(calls) = 0 THEN 1 ELSE sum(calls) END AS sum_calls,
  7. CASE WHEN sum(rows) = 0 THEN 1 ELSE sum(rows) END as sum_rows
  8. FROM pg_stat_statements
  9. )
  10. SELECT
  11. 'all_users' as "usename",
  12. 'all_databases' as "datname",
  13. 100 AS time_percent,
  14. 100 AS iotime_percent,
  15. 100 AS cputime_percent,
  16. (sum_time/1000)*INTERVAL '1 second' as total_time,
  17. (sum_cputime/sum_calls)::numeric(20, 2) AS avg_cpu_time_ms,
  18. (sum_iotime/sum_calls)::numeric(20, 2) AS avg_io_time_ms,
  19. sum_calls as calls,
  20. 100 AS calls_percent,
  21. sum_rows as rows,
  22. 100 as row_percent
  23. FROM s
  24. UNION ALL
  25. SELECT
  26. (select rolname from pg_roles where oid = p.userid) , (select datname from pg_database where p.dbid = oid),
  27. (100*total_time/(SELECT sum_time FROM s))::numeric(20, 2) AS time_percent,
  28. (100*(blk_read_time+blk_write_time)/(SELECT sum_iotime FROM s))::numeric(20, 2) AS iotime_percent,
  29. (100*(total_time-blk_read_time-blk_write_time)/(SELECT sum_cputime FROM s))::numeric(20, 2) AS cputime_percent,
  30. (total_time/1000)*INTERVAL '1 second' as total_time,
  31. ((total_time-blk_read_time-blk_write_time)/calls)::numeric(20, 2) AS avg_cpu_time_ms,
  32. ((blk_read_time+blk_write_time)/calls)::numeric(20, 2) AS avg_io_time_ms,
  33. calls,
  34. (100*calls/(SELECT sum_calls FROM s))::numeric(20, 2) AS calls_percent,
  35. rows,
  36. (100*rows/(SELECT sum_rows from s))::numeric(20, 2) AS row_percent
  37. FROM pg_stat_statements p
  38. WHERE
  39. (total_time-blk_read_time-blk_write_time)/(SELECT sum_cputime FROM s)>=0.005
  40. UNION ALL
  41. SELECT
  42. 'all_users' as "usename",
  43. 'all_databases' as "datname",
  44. (100*sum(total_time)/(SELECT sum_time FROM s))::numeric(20, 2) AS time_percent,
  45. (100*sum(blk_read_time+blk_write_time)/(SELECT sum_iotime FROM s))::numeric(20, 2) AS iotime_percent,
  46. (100*sum(total_time-blk_read_time-blk_write_time)/(SELECT sum_cputime FROM s))::numeric(20, 2) AS cputime_percent,
  47. (sum(total_time)/1000)*INTERVAL '1 second',
  48. (sum(total_time-blk_read_time-blk_write_time)/sum(calls))::numeric(10, 3) AS avg_cpu_time_ms,
  49. (sum(blk_read_time+blk_write_time)/sum(calls))::numeric(10, 3) AS avg_io_time_ms,
  50. sum(calls),
  51. (100*sum(calls)/(SELECT sum_calls FROM s))::numeric(20, 2) AS calls_percent,
  52. sum(rows),
  53. (100*sum(rows)/(SELECT sum_rows from s))::numeric(20, 2) AS row_percent
  54. FROM pg_stat_statements p
  55. WHERE
  56. (total_time-blk_read_time-blk_write_time)/(SELECT sum_cputime FROM s)<0.005 ORDER BY 4 DESC
Add Comment
Please, Sign In to add comment