我一直在尝试解决Heroku上一些反复发生的H12 / 13错误。在耗尽我在Google / Heroku / Stack Overflow上找到的所有内容后,我现在正在检查是否有一些长时间运行的数据库查询导致了Heroku支持建议的问题。
更新:我正在生产Crane实例。根据下面接受的答案......看来你不能在Heroku上做到这一点。我能做的最好的就是根据下面的SQL过滤它们:
SELECT u.usename, (total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time, query
FROM pg_stat_statements p
JOIN pg_user u ON (u.usesysid = p.userid)
WHERE query != '<insufficient privilege>'
ORDER BY 2
DESC LIMIT 10;
我正在尝试使用Craig Kerstien非常有用的帖子, http://www.craigkerstiens.com/2013/01/10/more-on-postgres-performance/但遇到了一些权限问题。
当我查询pg_stat_statements表时,我获得了一些较长时间运行的查询的“权限不足”,并且看起来Heroku不允许您更改用户权限。
有谁知道如何更改权限在Heroku上查看这些查询?
heroku pg:psql --remote production
psql (9.2.2, server 9.2.4)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
d4k2qvm4tmu579=> SELECT
d4k2qvm4tmu579-> (total_time / 1000 / 60) as total_minutes,
d4k2qvm4tmu579-> (total_time/calls) as average_time,
d4k2qvm4tmu579-> query
d4k2qvm4tmu579-> FROM pg_stat_statements
d4k2qvm4tmu579-> ORDER BY 1 DESC
d4k2qvm4tmu579-> LIMIT 10;
total_minutes | average_time | query
------------------+-------------------+--------------------------
121.755079699998 | 11.7572250919775 | <insufficient privilege>
17.9371053166656 | 1.73208859315089 | <insufficient privilege>
13.8710526000023 | 1.33945202190106 | <insufficient privilege>
6.98494270000089 | 0.674497883626922 | <insufficient privilege>
6.75377774999972 | 0.652175543095124 | <insufficient privilege>
6.55192439999995 | 0.632683664174224 | <insufficient privilege>
3.84014626666634 | 1.12786802880252 | <insufficient privilege>
3.40574066666667 | 1399.61945205479 | <insufficient privilege>
3.16332020000008 | 0.929081204384053 | <insufficient privilege>
2.30192519999944 | 0.222284382614463 | <insufficient privilege>
(10 rows)
答案 0 :(得分:2)
我无法直接回答你的问题,但也许可以看看pg-extra的插件,它将很多好处直接带到Heroku CLI并返回数据:)
答案 1 :(得分:0)
您需要运行Heroku Postgres的生产级实例才能使用pg_stat_statements。即使这样,它也只能显示您的应用程序(或任何使用heroku提供的凭据的客户端)运行的查询的统计信息。您将无法查看超级用户的查询(海报,收集)。生产计划是Crane和up(我相信)。
您可以通过加入pg_user来查看用户名:
SELECT u.usename, (total_time / 1000 / 60) as total_minutes,
(total_time/calls) as average_time, query
FROM pg_stat_statements p
JOIN pg_user u ON (u.usesysid = p.userid) ORDER BY 2 DESC LIMIT 10;