如何在Heroku上重置pg_stat_user_tables? (pg_stat_reset()需要超级用户)

时间:2013-01-16 11:31:23

标签: performance postgresql heroku indexing

我正在使用Heroku Postgres并希望了解在我的数据库中添加一些额外索引的效果。

我正在查询pg_stat_user_tables以查看使用索引的查询比例,但我相信自从我创建数据库以来就使用了统计信息。

我知道运行SELECT pg_stat_reset();会重置这些统计信息,但是当我尝试在pg:psql控制台中运行它时,我收到错误:

ERROR:  must be superuser to reset statistics counters

使用Heroku Postgres生产数据库是否有另一种方法可以实现这一目标?

2 个答案:

答案 0 :(得分:2)

重现将执行这些查询的方案或测试有多容易?你能做到以下几点吗?

  1. 在heroku上创建一个新的测试应用和测试数据库
  2. 使用旧索引部署旧版本的应用程序(如果不能复制整个数据库,则使用代表性的数据子集)
  3. 运行您的查询或测试,或运用您的应用
  4. 请注意db statistics
  5. 删除测试数据库并创建一个新数据库
  6. 使用您的数据填充新的测试数据库,并添加新索引
  7. 将测试应用指向新数据库
  8. 再次运行查询或测试
  9. 请注意新的db statics
  10. 希望您能够轻松创建一组有代表性的数据,以便您更轻松地测试查询。

答案 1 :(得分:2)

我今天通过支持请求发现现在已添加:

function matchRecursiveRegExp (str, left, right, flags) { var str_copy = str, f = flags || "", g = f.indexOf("g") > -1, x = new RegExp(left + "|" + right, "g" + f.replace(/g/g, "")), l = new RegExp(left, f.replace(/g/g, "")), a = [], b = [], keep_going, t, s, m; do { t = 0; keep_going = false; while (m = x.exec(str_copy)) { if (l.test(m[0])) { if (!t++) { s = x.lastIndex; } else { //another start has occurred, save that off b.push(m.index); } } else if (t) { if (!--t) { a.push(str_copy.slice(s, m.index)); //found the end match if (!g) return a; } } } if (g && b.length) { //nested matches found //slice the string with the index that was //saved and keep going str_copy = str_copy.slice(b.shift()); keep_going = true; } } while (keep_going || (t && (x.lastIndex = s))); return a; } var str = '((!%Q1% || %Q2%) || ((%Q3% && %Q4%) || (%Q5% && %Q6%)))'; var res = matchRecursiveRegExp(str, '\\(', '\\)', 'g'); for (var i = 0; i<res.length; i++) document.body.innerHTML += "(" + res[i] + ")" + "<br/>";

heroku plugins:install git://github.com/heroku/heroku-pg-extras.git