UNPKG

1.6 kBJavaScriptView Raw
1'use strict'
2
3const co = require('co')
4const cli = require('heroku-cli-util')
5const pg = require('heroku-pg')
6const util = require('../lib/util')
7
8function * run (context, heroku) {
9 let db = yield pg.fetcher(heroku).database(context.app, context.args.database)
10
11 yield util.ensurePGStatStatement(db)
12
13 if (context.flags.reset) {
14 yield pg.psql.exec(db, 'select pg_stat_statements_reset()')
15 return
16 }
17
18 let truncatedQueryString = context.flags.truncate
19 ? 'CASE WHEN length(query) <= 40 THEN query ELSE substr(query, 0, 39) || \'…\' END'
20 : 'query'
21
22 let query = `
23SELECT interval '1 millisecond' * total_time AS total_exec_time,
24to_char((total_time/sum(total_time) OVER()) * 100, 'FM90D0') || '%' AS prop_exec_time,
25to_char(calls, 'FM999G999G999G990') AS ncalls,
26interval '1 millisecond' * (blk_read_time + blk_write_time) AS sync_io_time,
27${truncatedQueryString} AS query
28FROM pg_stat_statements WHERE userid = (SELECT usesysid FROM pg_user WHERE usename = current_user LIMIT 1)
29ORDER BY total_time DESC LIMIT 10
30`
31
32 let output = yield pg.psql.exec(db, query)
33 process.stdout.write(output)
34}
35
36const cmd = {
37 topic: 'pg',
38 description: 'show 10 queries that have longest execution time in aggregate',
39 needsApp: true,
40 needsAuth: true,
41 args: [{name: 'database', optional: true}],
42 flags: [
43 {name: 'reset', description: 'resets statistics gathered by pg_stat_statements'},
44 {name: 'truncate', char: 't', description: 'truncate queries to 40 characters'}
45 ],
46 run: cli.command(co.wrap(run))
47}
48
49module.exports = [
50 Object.assign({command: 'outliers'}, cmd)
51]